1. 前言
本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。 **这是源码共读的第21期,链接:juejin.cn/post/708310...
2. await-to-js库了解
通过await-to-js库,就可以在使用async 和await的时候轻松处理错误信息
如下示例
javascript
import to from 'await-to-js';
async function test() {
// 1. try...catch捕获错误
try{
const user = await UserModel.findById(1);
}catch(e) {
return cb('No user found');
}
// 2使用Promise.catch捕获错误
const res = await UserModel.findById(1).catch((e) => {
return cb('No user found');
});
// 3. 使用to函数捕获错误
const [err, user] = await to(UserModel.findById(1));
if(!user) return cb('No user found');
}
3. 源码解析
源码就封装了一个to方法, 统一处理 Promise 的成功和失败情况:
- 如果 Promise 成功解析(resolved) ,返回
[null, data]
,其中data
是解析的值。 - 如果 Promise 被拒绝(rejected) ,返回
[error, undefined]
,其中error
是捕获的错误
这样我们就方便获取err啦~
typescript
/**
* @param { Promise } promise 一个promise传参
* @param { Object= } errorExt - Additional Information you can pass to the err object 用户传入的额外错误提示
* @return { Promise }
*/
export function to<T, U = Error> (
promise: Promise<T>,
errorExt?: object
): Promise<[U, undefined] | [null, T]> {
return promise
.then<[null, T]>((data: T) => [null, data]) // resolved后,err就为null返回
.catch<[U, undefined]>((err: U) => {
if (errorExt) {
const parsedError = Object.assign({}, err, errorExt); // 合并错误信息errorExt
return [parsedError, undefined]; // 返回[parsedError, undefined]
}
return [err, undefined]; // 直接返回[err, undefined]
});
}
export default to;
4. 总结
虽然是小小的一个封装,但是用处极大