首页 > 解决方案 > 运行并行传奇效果而不取消其中任何一个

问题描述

我想用 redux-saga 运行并行效果,如果发生错误而不抛出。

使用allredux-saga 的效果,如果:

在所有效果完成之前,其中一个效果被拒绝:在生成器中抛出拒绝错误。

基本上,我想等待所有效果完成触发动作。我想做这样的事情,但用all别的东西代替:

export function* getSaga() {
  yield put(request());
  try {
    yield all([fetchItems1, fetchItems2, fetchItems3]);
    // Wait for all to resolve or get rejected, then dispatch succeed.
    yield put(actions.succeeded());
  } catch (e) {
    // This should never happen.
  }
}

我尝试使用fork,但如果一项失败,它会取消所有其他任务。而且我尝试使用spawn,但它不会等待任务完成来 dispatch succeeded

使用常规 JS,有一种称为反射的模式,我想将其应用于 saga。

我们怎样才能做到这一点?

谢谢

标签: reduxredux-saga

解决方案


按照链接的 stackoverflow 问题的答案,您可以轻松地创建一个reflectsaga 并以相同的方式使用它:

function* reflect(saga) {
  try {
    return { v: yield call(saga), status: 'fulfilled' }
  } catch (err) {
    return { e: err, status: 'rejected' }
  }
}
...
yield all([fetchItems1, fetchItems2, fetchItems3].map(reflect));

工作示例:https ://codesandbox.io/s/y2vx74jzqv


推荐阅读