这是正常方式:
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
}
}
无论如何都有以上方式来处理错误?使用正常方式有时会导致重复处理相同的错误。
答案 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参数与适当的字段一起使用。