【问题标题】:React/Redux how to wait for dispatched action to complete?React/Redux 如何等待调度的动作完成?
【发布时间】:2021-10-10 21:39:11
【问题描述】:

在我的 thunk 中,我在一个名为 dispatches 的数组中有两个调度,它们修改了 Redux 存储。只有在它们都完成之后(即修改了 Redux 存储),我才想调度 finalDispatchCall。我尝试将它们都放在Promise 中并调用then,但我仍然看到finalDispatchCall 是在secondDispatchCall 更新Redux 存储之前创建的。

const dispatches = [];
dispatches.push(dispatch(firstDispatchCall());
dispatches.push(dispatch(secondDispatchCall());
Promise.all([...dispatches]).then(() => {
 dispatch(finalDispatchCall());
})
.catch(error => {
 logger.error(
  `Print out error - ${error}`
 );
});

有没有办法在调用另一个调度之前确保调度已经完成?

编辑(更多细节):

firstDispatchCall 正在进行 API 调用(返回 fetch)并在 then 语句中调度操作以更新 redux 存储。 secondDispatchCall 还在进行 API 调用(返回 fetch)并在其 then 语句中分派另外两个操作,每个操作都进行自己的 API 调用并分派操作以更新 redux 存储。

我想等到所有这些都完成后再制作finalDispatchCall

【问题讨论】:

  • 似乎您的 firstDispatchCallsecondDispatchCall 操作在完成工作之前立即解决(返回已解决的值)。您需要分享这些操作实际上在做什么,以便我们可以帮助您的代码等待它们。我怀疑您将 async/await 与 Promise 链混合在一起,实际上并没有等待任何操作。
  • @DrewReese firstDispatchCall 正在进行 API 调用(返回 fetch)并在 then 语句中调度操作以更新 redux 存储。 secondDispatchCall 还进行 API 调用(返回 fetch)并在其 then 语句中调度另外两个动作,每个语句都进行自己的 API 调用并调度动作以更新 redux 存储。我想等到所有这些都完成后再做finalDispatchCall

标签: reactjs redux react-redux redux-thunk


【解决方案1】:

只要firstDispatchCall()secondDispatchCall() 是同步的,redux 就保证它们将按顺序同步到达,并且随后对dispatch() 的调用将作用于更新的状态。但是,如果您想绝对确定,您可以使用store.subscribe(),在程序上等待您期望的所有更改,并阅读每个更改的商店以确认它们都在那里。如果第一个和第二个 DispatchCall 是异步的,这实际上是必不可少的。

但是,问题是您是否真的需要从那个特定的 thunk 中知道所有调度何时到达。 Redux 是一个事件总线,因此提供了许多方法来给异步猫换肤。通过等待这些调度以调度最后一个调度,这可能有助于更多地了解您试图解决的问题。可能你真的不需要这样做......

我建议阅读 Redux 团队对这个确切问题的看法:"Should I dispatch multiple actions in a row from one action creator?"。特别注意那里:

“一般来说,询问这些动作是否相关但独立,或者 实际上应该表示为一个动作。”

Redux 的新手经常使用多个操作来完成一个操作,因为他们忘记了多个 reducer 都可以监听同一个操作

【讨论】:

  • 嗯,关于传统的 redux 和 reducer,是的,AFAIK 有保证的顺序......它们按照它们被分派的顺序进行处理,因为一次只处理一个动作.你是对的,但是当涉及到 thunk 和异步中间件时,无论异步逻辑在做什么都可以按任何顺序解决。
  • 是的,你是对的,谢谢。我想我记得在 Redux 的黑暗早期,gaearon 震惊了我们,说它没有提供明确的保证,人们应该相应地计划,但这似乎不再是真的了。 (如果有的话)。
  • 大家欢呼Gaearon。是的,我可以同意 Redux 没有提供明确保证的说法,但也许它不需要。我认为在单线程、同步 javascript 世界中分派动作的顺序处理足以保证依赖。 (希望我不是在做毫无根据的假设
  • 他说:“动作是同步分派的,所以 Redux 保证商店在接受下一个动作之前已经收到了下一个状态。” --github.com/reduxjs/redux/issues/1199
猜你喜欢
  • 2017-04-18
  • 2021-03-05
  • 2019-11-06
  • 1970-01-01
  • 2020-04-23
  • 2019-04-25
  • 2019-03-20
  • 2019-02-14
  • 2019-05-13
相关资源
最近更新 更多