我有一个传奇:
function* mySaga() {
try {
yield put({type: 'ACTION_TYPE'})
} catch (e) {
handleError(e)
}
}
如果处理ACTION_TYPE
的reducer抛出错误,catch块将不会运行。至少不在我的测试中。
我已经设置了一个Redux中间件来捕获所有错误,然后发送一个可以相应更新商店的操作。
const errorHandlerMiddleware = store => next => action => {
try {
return next(action)
} catch (err) {
return next({
type: 'START_ERROR_STATE',
err: err
})
}
}
但是,如果我有另外一个传递两个连续动作的传奇:
function* anotherSaga() {
try {
yield put({type: 'ACTION_TYPE'})
yield put({type: 'ANOTHER_ACTION_TYPE'})
} catch (e) {
handleError(e)
}
}
即使处理ACTION_TYPE
类型操作的reducer会引发错误,anotherSaga
仍然会调度ANOTHER_ACTION_TYPE
。我不希望这种情况发生。
我实施了一场比赛:
function* raceSaga() {
const { error} = yield race({
main: call(anotherSaga),
error: take('START_ERROR_STATE')
})
if (main) {
yield put({type: 'SUCCESS_ACTION'})
} else if (error) {
yield put({type: 'ERROR_ACTION'})
}
}
我不确定这是否是最佳方法。
答案 0 :(得分:0)
您的redux设置有问题。引用redux文档:
reducer是一个纯函数,它接受前一个状态和一个动作,并返回下一个状态
这意味着你不能在reducer中抛出错误。它应该采取状态,动作对象并返回下一个状态。我建议你重新阅读redux文档或一些教程。