问题描述:
一、使用Antd的Modal的Confirm 若是返回一个Promise,它会本身关闭 loading状态。在使用过程当中,已经返回了Promise,在后端报错的时候,loading并无消失,当时的临时处理方案为,在相应的 effects
添加 try catchgit
// Effects
*getList({ payload }, { call }) {
try {
return yield call(getList, payload);
} catch (err) {
return Promise.reject(err);
}
},
二、出现过一个问题,后端接口异常,在dva effects
中没有进行异常处理,结果阻塞下面的流程,正常的逻辑是,上一次报错了,这一次应该能够正常请求。添加try catch
后问题获得解决。github
看完以上的问题描述,你可能会有一下问题:web
-
为何不加try catch 会阻塞流程? -
是否是每一个effects都要添加try catch的处理? -
有没有地方能够统一处理这些错误?
带着上面这些问题接着往下看:redux
dva effects异常
// Effects
*getList({ payload }, { call }) {
return yield call(getList, payload);
},
此时若是后台服务器返回错误,会致使call Effect抛出异常,最终会致使generator
中止运行。解决的方法是能够加上try catch
,例如后端
*getList({ payload }, { call }) {
try {
return yield call(getList, payload);
} catch (err) {
return Promise.reject(err);
}
},
可是这样的话,须要每次调用时都try catch
,所以须要统一异常处理。promise
统一异常处理
Ant Design封装的是umi,umi封装了dva
,dva
封装了redux-saga
。统一异常处理能够在umi中进行。官方文档[1]中说明以下:服务器
dva
里,effects
和subscriptions
的抛错所有会走onError hook
,因此能够在onError
里统一处理错误。微信
在 src
目录下新建 app.js
,内容以下:app
export const dva = {
config: {
onError(e) {
e.preventDefault();
console.error(e.message);
},
},
};
而后effects
里的抛错和reject
的promise
就都会被捕获到了。编辑器
固然若是某个effects须要作特殊的异常处理逻辑,则须要在定义这个effects
的地方单独添加try catch
进行处理。
总结
-
每一个effects都须要使用 try catch 作异常处理。 -
umi提供了统一处理的配置,若是有特殊逻辑,则须要单独添加处理逻辑。
参考资料
官方文档: https://github.com/umijs/umi/blob/umi%402.3.1/docs/zh/guide/with-dva.md
本文分享自微信公众号 - 牧码的星星(gh_0d71d9e8b1c3)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。