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为真,岂不是会抛出异常?
其实,上面那个提问者(Anler Hernández Peral)已经给出了答案,不可能。为什么?因为Javascript是单线程(single thread),只有一个函数调用栈(call stack),所以一次只能执行一件事/函数(one thing at a time)。注意并发与并行的区别:单线程,只是把时间分配给子任务运行,看起来像并行而已。
好像差不多就应该是这样。
问题三:异步或者事件又是怎么回事?
完整的解释可以参考?的链接,我这儿把图扒出来:Javascript是单线程,但浏览器不是,浏览器提供了各种API处理各种事件,这些事件扔到队列(callback queue)里,等到调用栈(stack)为空再按顺序执行。
参考
关键词:javascript, atomic, code block, concurrency model (并发模型), event loop (事件循环)