redux: isDispatching

reactjs/redux
createStore.js

var isDispatching = false

function dispatch(action) {

  ...

  if (isDispatching) {
    throw new Error('Reducers may not dispatch actions.')
  }

  try {
    isDispatching = true
    currentState = currentReducer(currentState, action)
  } finally {
    isDispatching = false
  }

  ...
}

问题一:为什么要设置和判断isDispatching

问题同isDispatching really needed? #1668

Dan Abramov: If you attempt to call dispatch from inside the reducer, it will throw with an error saying “Reducers may not dispatch actions.”

isDispatching判断,保护的是reducer处理action得到新的state这一段,避免出现reducer中调用dispatch(开发者手抖了),而dispatch又会调用reducer(redux就是这么设计的)...进入死循环。这个判断并抛出异常是提醒开发者用的。嗯,异常就是给开发者看的,生产环境不应该出现的。

具体例子在刚刚那个问题的回答中也可以找到。

问题二:这样做会不会有问题?

比如并发:处理第一个dispatch的时候,第二个判断isDispatching为真,岂不是会抛出异常?

redux: isDispatching

其实,上面那个提问者(Anler Hernández Peral)已经给出了答案,不可能。为什么?因为Javascript是单线程(single thread),只有一个函数调用栈(call stack),所以一次只能执行一件事/函数(one thing at a time)。注意并发与并行的区别:单线程,只是把时间分配给子任务运行,看起来像并行而已。

redux: isDispatching

好像差不多就应该是这样。

问题三:异步或者事件又是怎么回事?

完整的解释可以参考?的链接,我这儿把图扒出来:Javascript是单线程,但浏览器不是,浏览器提供了各种API处理各种事件,这些事件扔到队列(callback queue)里,等到调用栈(stack)为空再按顺序执行。

redux: isDispatching

参考

关键词:javascript, atomic, code block, concurrency model (并发模型), event loop (事件循环)