繁体   English   中英

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

[英]What is the best practice for handling async action errors in redux?

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中:

在此处输入图片说明

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

在我自己的项目中,我将尝试管理所有错误应用程序,可能使用一些可以用适当的错误代码修改的通用动作分派器。 但就您的示例而言,您可能不想将错误抛出,因为在可能导致错误的方法中使用了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生成异常,则将执行错误操作分派器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM