【问题标题】:Redux Toolkit: lifecycle action types doesn't sync up when dispatching multiple async thunk actions in one thunkRedux Toolkit:在一个 thunk 中调度多个异步 thunk 操作时,生命周期操作类型不会同步
【发布时间】:2023-04-05 03:39:01
【问题描述】:

我有一个异步 thunk 操作来像这样编排多个异步 thunk

const someAction = createAsyncThunk(
  'my/someAction',
  async () => {...}
)
const someAction2 = createAsyncThunk(
  'my/someAction2',
  async () => {...}
)
const generatedThunk = createAsyncThunk(
  'my/thunk',
  async (arg, thunkApi) => {
    thunkApi.dispatch(someAction());
    thunkApi.dispatch(someAction2());
  }
)

我发现异步 thunk 之一,即 someActionsomeAction 被拒绝,my/thunk 仍然会被满足。当其中一个 thunk 拒绝时,我如何使 my/thunk 被拒绝?

【问题讨论】:

    标签: javascript reactjs typescript redux redux-toolkit


    【解决方案1】:

    createAsyncThunk 始终捕捉错误,以便我们避免在您的应用中出现“未捕获的承诺拒绝”消息。

    你需要自己检查每一个的结果,并相应地返回一个被拒绝的承诺。

    另外,请注意,按照当前编写的方式,您的代码将同时运行这两个 thunk。没关系,只要确保它是您真正想要的 - 串行运行它们,您需要 await 它们。

    这里的一个选项是:

    return Promise.all([
      thunkApi.dispatch(someAction()).then(unwrapResult),
      thunkApi.dispatch(someAction2()).then(unwrapResult)
    ]);
    

    那会:

    • 并行运行这两个操作
    • 将每个操作的结果操作转换回已履行或拒绝的承诺
    • 如果其中任何一个请求被拒绝,则返回一个将拒绝的承诺

    【讨论】:

    • 您好,感谢您的回复!实际上someActionsomeAction2 不是并行的,someAction2 只会在someAction 期间发生某些错误时执行,我大大简化了代码,所以看起来它们是并行的。如果我们只看其中一个,正如我所问的,我希望'my/thunk' 拒绝'my/someAction' or my/someAction2` 拒绝,我需要返回一个将拒绝的承诺。我想知道您是否可以在答案中添加代码 sn-p 来告诉我如何做到这一点?谢谢!
    • 顺便说一句,如果我必须串行运行这些操作,我需要await。我想知道是否还有其他方法可以使用Promise 上的静态方法,例如Promise.all(我知道Promise.all 在这种情况下不起作用)
    【解决方案2】:

    检查您的子操作结果,只需在thrownew Error 那里,您的主要操作会自动捕获它。并将以reject结束。

    例如:

    或者如果您的类型配置正确,您可以破坏错误对象并检查错误,如下所示: if(error) throw Error('Some message!');

    【讨论】:

    • 子action返回一个promise,当promise解决时子action为fulfilled,当promise拒绝时为rejected
    • 您需要使用await,否则您的主要操作不会等待他的子操作并在子操作被执行或拒绝之前返回。
    • 我尝试await 子操作,但当子操作被拒绝时,仍然没有为主要操作获得rejected。我的孩子动作真的是这样export const action = createAsyncThunk("action",async () => { return Promise.reject("reject"); }。但是unwrapResult 确实解决了问题
    猜你喜欢
    • 1970-01-01
    • 2020-01-17
    • 2021-07-09
    • 2021-01-22
    • 2021-10-04
    • 2018-01-31
    • 2019-12-17
    • 2017-03-03
    • 2019-11-12
    相关资源
    最近更新 更多