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为真,岂不是会抛出异常?

throw Error?

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

single thread

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

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

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

js environment

参考

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值