如何在包装器中处理redux saga错误?

时间:2017-07-05 07:31:51

标签: javascript reactjs redux redux-saga

这是正常方式

function* saga1() {
  try {
    // do stuff
  } catch (err) {
    // handle err
  }
}

function* saga2() {
  try {
  } catch (err) {
  }
}

function* wrapper() {
  yield [
    takeLatest('saga1', saga1),
    takeLatest('saga2', saga2),
  ];
}

这是预期的方式

function* saga1() {
}

function* saga2() {
}

function* wrapper() {
  try {
    takeLatest('saga1', saga1),
    takeLatest('saga2', saga2),
  } catch (err) {
    // handle errors
  }
}

无论如何都有以上方式来处理错误?使用正常方式有时会导致重复处理相同的错误。

1 个答案:

答案 0 :(得分:1)

对于这种情况,最简单的方法是在saga中使用并行动态效果。当然,它不是真正的线程,而是编写异步操作序列的方法。

让我们深入了解您的示例。像yield [ takeA(), takeB() ]这样的构造假设您将A& B操作委托给具有提供的回调的saga工作流。换句话说,包装器的执行暂时完成,因此try / catch不合适。

另外,您可以fork作为两个或更多独立传奇过程的并行动态效果,并在其中的哪一个中进行无限循环。

代码:

function* proc1() {
  while(true) {
    yield call(() => new Promise(resolve => setTimeout(resolve, 1500)));
    throw new Error('Err1')
  }
}

function* proc2() {
  while(true) {
    yield call(() => new Promise(resolve => setTimeout(resolve, 2000)));
    throw new Error('Err2')
  }
}

function* watchLoadRequest() {
  try {
    yield [call(proc1), call(proc2)]
  } catch(err) {
    console.log('@@ERROR@@', err);
  }
}

当然,您应该在并行程序中实现自定义业务登录。如果它们之间需要持久/共享状态,请将object参数与适当的字段一起使用。