即使其中一项承诺被拒绝,也不要让整个任务失败

Pat*_*kkx 7 javascript promise reactjs redux-saga react-redux

在 redux saga 中,如果我们想处理多个 promise,我们可以使用all(相当于Promise.all):

yield all(
   users.map((user) => call(signUser, user)),
);

function* signUser() {
   yield call(someApi);
   yield put(someSuccessAction);
}
Run Code Online (Sandbox Code Playgroud)

问题是,即使其中一个承诺(调用)失败,整个任务也会被取消。

我的目标是保持任务活着,即使其中一项承诺失败。

在纯 JS 中我可以用 来处理它Promise.allSettled,但是在 redux saga 中正确的方法是什么?

编辑:仍然没有找到任何合适的解决方案,即使我包装了yield allintry... catch块,即使其中一个调用失败,整个任务也会被取消。

Ame*_*icA 3

实际上,你应该将 Promises 数组更改为allRedux-Saga 的方法,你应该像下面这样编写:

yield all(
  users.map((item) =>
    (function* () {
      try {
        return yield call(signUser, item);
      } catch (e) {
        return e; // **
      }
    })()
  )
);
Run Code Online (Sandbox Code Playgroud)

您传递一个自调用生成器函数来处理错误,而不是throw使用return。因此,该行有两颗星(**)。

通过使用这种方式,所有异步操作都会返回已解决的状态,并且该all方法从未出现过拒绝。