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

Posted

技术标签:

【中文标题】Redux 中的 store.dispatch 是同步的还是异步的【英文标题】:Is store.dispatch in Redux synchronous or asynchronous 【发布时间】:2017-09-02 17:31:32 【问题描述】:

我意识到这是一个基本问题,但我没有运气在其他地方找到答案。

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

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

【问题讨论】:

请注意,状态是同步更新的 (getState()) 但mapStateToProps 不会。所以this.props.value 是旧值,getState().value 是新值 - codesandbox.io/s/reactredux-forked-0m5eo?file=/Page.js 在新的 v7 实现中,dispatch 保持同步,但是如果你使用它和 react 一起使用,那么组件更新是批处理的,类似于 react setState 【参考方案1】:

AFAIK,调度动作是同步的。如果你愿意处理异步调用,你可以在 redux 中使用thunk-middleware,其中 dispatch 是作为回调函数提供的,你可以根据自己的方便调用它。有关更多信息,请查看作者本人关于 SO 的答案:How to dispatch a Redux action with a timeout?

【讨论】:

但是很多人建议我:不要在异步流中调用dispatch,这会使redux状态变得不可预测,你应该sync调用dispatch。但是 thunk-middleware 只是在 await 之后调用 dispatch,这是异步流程。哪种观点是正确的?对不起我的英语不好:) 我不确定您面临的挑战,但使用thunk 操作的总体思路是促进代码的异步流程。例如一旦 promise 完成,用户就可以发送操作。【参考方案2】:

没有人比code itself 更了解。 =) 如您所见,dispatch 是绝对同步的。这里唯一的警告是 store enhancers 可以(并且确实)替换 dispatch 方法。例如,看看at applyMiddleware enhancer,它可以让你通过用自己的实现替换默认的dispatch 方法来插入中间件。虽然我从未见过任何 Redux enhancer 实际上会消除 dispatch 的同步性质。

【讨论】:

您应该将应用中间件链接更新为https://github.com/reduxjs/redux/blob/master/src/applyMiddleware.ts#L19(由于从 js -> ts 迁移的 redux,我无法进行编辑,因为它的长度小于 6 个字符)。或者,也许你应该在他们仍然使用 js 时引用一个提交,就像在你的 code itself 链接中一样,由于提交的“永久链接”方面,这会导致死链接。

以上是关于Redux 中的 store.dispatch 是同步的还是异步的的主要内容,如果未能解决你的问题,请参考以下文章

redux store dispatch 导致 React 中的 setState error()

Redux Persist TypeError:store.dispatch 不是函数

还原 |如何正确连接到 redux 商店

[Redux/Mobx] 说说Redux的实现流程

4redux源码解析 - 糅合多种dispatch

对 redux 存储的更改是不是同步发生? [复制]