在Redux中处理异步操作错误的最佳实践是什么?

时间:2018-07-26 22:52:20

标签: javascript redux es6-promise redux-thunk

export const saveSomething = (thing = {}) => {
  dispatch({
    type: THING_SAVING,
  });

  return async function (dispatch) {
    try {
      await persistThing(thing);
    } catch (e) {
      dispatch({
        type: THING_SAVE_ERROR,
        error: e,
      });
      throw e;
    }

    dispatch({
      type: THING_SAVED,
      error: e,
    });
  }
}

handleSubmitClick(e) {
  dispatch(saveSomething({ name: e.target.value }))
    .catch(e => {
      // pass
    });
}

因此,我可能对此想法有所思考,但我试图在此处找出最佳做法。当我的异步操作发生错误时,即使我正在调度一个错误,也仍然可以将其抛出,因此如果某些组件想要在其上键入内容,则诺言将被拒绝。但是,这意味着为了不对未处理的承诺拒绝使用Create-React-App炸弹,我需要在分派动作时添加此虚拟捕获,恕我直言,这很丑陋。

这里的最佳做法是什么?不会抛出错误?使用假人?还有吗?

编辑:之所以需要虚拟捕获,是因为否则该应用程序在我身上轰炸,至少在create-react-app中如此:

enter image description here

(错误并非100%与我的伪代码匹配,但您明白了)

1 个答案:

答案 0 :(得分:1)

在我自己的项目中,我将尝试管理所有错误应用程序,可能使用一些可以用适当的错误代码修改的通用动作分派器。但是以您的示例为例,您可能不想将错误抛出,因为在可能导致错误的方法中使用了await。所以我会像这样重写代码:

export const saveSomething = (thing = {}) => {
  dispatch({
    type: THING_SAVING,
  });

  return async function (dispatch) {
    try {
      await persistThing(thing);
      dispatch({
       type: THING_SAVED,
      });
    } catch (e) {
      dispatch({
        type: THING_SAVE_ERROR,
        error: e,
      });
    }
  }
}

如果什么都没有发生,并且一切都顺利进行,那么在异步调用persistThing完成之后,动作分派器将被执行。而且,如果persistThing产生异常,则错误操作分派器将被执行。