Redux 中的 store.dispatch 是同步的还是异步的
Posted
技术标签:
【中文标题】Redux 中的 store.dispatch 是同步的还是异步的【英文标题】:Is store.dispatch in Redux synchronous or asynchronous 【发布时间】:2017-09-02 17:31:32 【问题描述】:我意识到这是一个基本问题,但我没有运气在其他地方找到答案。
store.dispatch
在Redux
中是同步的还是异步的?
如果它是异步的,是否有可能在传播操作后添加回调,就像 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()