Redux同时派发多Action时同一Store对象的状态更新机制问询
Redux 处理同时派发多个Action的行为解析
简单说:Redux会严格按照Action被派发的顺序,串行同步地依次处理每一个Action,绝对不会同时处理,也不会出现第二个Action直接覆盖第一个更改的情况——除非你的reducer逻辑本身写得有问题。
具体展开说:
- Redux的
store.dispatch()是个同步函数,每一次调用它,都会走完一整套完整的同步流程:接收Action → 把当前状态和Action传入reducer计算新状态 → 更新Store → 通知所有订阅者。 - JavaScript本身是单线程的,哪怕你几乎同时触发两个dispatch(比如你说的两个数据流同时返回数据),这两个dispatch调用也会被放进事件循环的队列里,一个接一个执行。第一个Action完全处理完、Store状态更新完成之后,第二个Action才会开始处理。
- 拿你的场景举例:第一个数据流触发处理函数,dispatch Action A更新Store里的对象X;Redux会先基于当前X的状态,用Action A计算出X的新状态并更新Store。之后第二个数据流的Action B才会被处理,这时候它拿到的是Action A处理后的X状态,再基于这个新状态做修改——完全是顺序执行,不存在“并行修改导致覆盖”的问题。
- 顺便提一句:如果你用了redux-thunk这类异步中间件,看起来是“异步dispatch”,但本质上只是把dispatch的时机延后到异步操作完成后,最终每个dispatch依然是同步串行处理的,状态更新的顺序还是严格按照dispatch被调用的顺序来。
最后要注意:如果真的出现了状态覆盖的问题,那大概率是你的reducer写法不对——比如直接把整个对象替换成新的,没有合并之前的属性;或者reducer不是纯函数,依赖了外部可变状态。只要你的reducer是纯函数,每次都基于传入的state和action返回新状态,Redux的串行处理就能保证状态更新的可预测性。
内容的提问来源于stack exchange,提问作者0x4a43
相关产品推荐
相关产品推荐

