在传奇上下文中,如何处理reducer错误?

时间:2017-01-26 19:22:38

标签: redux react-redux redux-saga

我有一个传奇:

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'})
  }
}

我不确定这是否是最佳方法。

1 个答案:

答案 0 :(得分:0)

您的redux设置有问题。引用redux文档:

  

reducer是一个纯函数,它接受前一个状态和一个动作,并返回下一个状态

这意味着你不能在reducer中抛出错误。它应该采取状态,动作对象并返回下一个状态。我建议你重新阅读redux文档或一些教程。