javascript - 即使其中一个 promise 被拒绝,也不要让整个任务失败

标签 javascript reactjs promise react-redux redux-saga

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

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

function* signUser() {
   yield call(someApi);
   yield put(someSuccessAction);
}
问题是 ,即使其中一个 promise (调用)失败,整个任务也会被取消。
我的目标是保住任务活着 ,即使其中一个 promise 失败了。
在纯 JS 中,我可以用 Promise.allSettled 处理它,但是在 redux saga 中做这件事的正确方法是什么?
编辑 : 即使我把 yield all 包装起来,仍然没有找到任何合适的解决方案在 try... catch block ,即使其中一个调用失败,整个任务也会被取消。

最佳答案

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

yield all(
  users.map((item) =>
    (function* () {
      try {
        return yield call(signUser, item);
      } catch (e) {
        return e; // **
      }
    })()
  )
);
您传递一个自调用生成器函数来处理错误,而不是 throw使用 return .因此,有两颗星(**)的线。
通过使用这种方式,您的所有异步操作都将返回为已解决,all方法没见过拒绝。

关于javascript - 即使其中一个 promise 被拒绝,也不要让整个任务失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63619471/

相关文章:

javascript - 安装 Phonegap/Cordova 3.1 插件 (barcodescanner)

javascript - jquery解析ajax响应

javascript - React-admin 在共享相同资源的两个列表上分隔过滤器

node.js - aws-amplify auth currentSession 不返回当前用户

node.js - 在 Promise.all 中解析时将 Promise 结果流式传输给客户端

Angular2 在 promise.resolve 中包装 Bootstrap 功能,

javascript - Laravel 获取预期的 url

javascript - 绑定(bind)超出范围的变量可以加速您的代码吗?

javascript - 需要一些关于使用 React 的动态表单的建议

javascript - React.js 测试未能找到组件