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%与我的伪代码匹配,但您明白了)
答案 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
产生异常,则错误操作分派器将被执行。