Redux中的store.dispatch是同步还是异步的?

154

我知道这是一个基础问题,但是在其他地方没有找到答案。

store.dispatchRedux 中是同步还是异步的?

如果它是异步的,是否有可能像在 React 中一样,在动作传播后添加回调函数?


请注意,状态同步更新(getState()),但mapStateToProps没有。因此,this.props.value是旧值,而getState().value是新值 - https://codesandbox.io/s/reactredux-forked-0m5eo?file=/Page.js - Mosh Feu
在新的v7实现中,调度仍然是同步的,但如果您与React一起使用它,则组件更新会进行批处理,类似于React的setState。 - gaurav5430
2个回答

120
据我所知,派发操作是同步的。如果您想处理异步调用,可以在redux中使用thunk-middleware,其中dispatch被提供为回调函数,您可以根据需要调用它。了解更多信息,请查看这篇作者自己在SO上的答案:如何使用超时派发Redux操作?

但是很多人建议我:不要在异步流中调用dispatch,这会使redux状态变得不可预测,你应该同步调用dispatch。但是thunk-middleware在await之后只是调用dispatch,这是异步流。哪种观点是正确的?对不起我的英语不好 :) - nuclear
我不确定你面临的挑战是什么,但使用 thunk 操作的总体想法是促进代码的异步流程。例如,用户可以在承诺实现后调度操作。 - Aman Gupta

92

没有比代码本身更了解的了。=)正如你所看到的,dispatch 是完全同步的。这里唯一需要注意的是,存储 enhancers 可以(并且会)替换 dispatch 方法。例如,看看 applyMiddleware enhancer,它允许您通过将默认的 dispatch 方法替换为自己的实现来插入中间件。虽然我从未见过任何 Redux enhancer 实际上会删除 dispatch 的同步性。


1
你应该更新 apply middleware 的链接为 https://github.com/reduxjs/redux/blob/master/src/applyMiddleware.ts#L19(由于 redux 从 js -> ts 迁移,我不能进行编辑,因为它少于 6 个字符)。或者,也许你应该引用使用 js 的提交时期的提交记录,就像你的“代码本身”链接一样,但是这样会由于提交记录的“永久链接”特性而失效。 - shanshine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接