- 本文参加了由公众号@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。
- 这是源码共读的第21期
简介
对于Promise链式调用的异常捕获我们一般使用 .catch,但对于async/await并未提供异常捕获的钩子,所以我们会用 try 、catch进行捕获异常,那么异步操作多了代码就相对臃肿了,await-to-js针对async/await做了对应异常捕获处理,代码实现起来更优雅。
源码
/**
* @param { Promise } promise
* @param { Object= } errorExt - Additional Information you can pass to the err object
* @return { Promise }
* @desc: 入参1:promise , 入参2: 异常报错
* 函数返回一个数组, arr1: promise返回正常值, arr2: 异常报错,正常时返回undefined
*/
function to(promise, errorExt) {
return promise
.then(function (data) { return [null, data]; })
.catch(function (err) {
if (errorExt) {
Object.assign(err, errorExt);
}
return [err, undefined];
});
}
let promise = new Promise(function (resolve, reject) {
// resolve('成功了');
reject('失败了')
});
let [err, data] = await to(promise)
console.log(err, data);
解读
本质是在函数内部进行promise的解析,针对promise返回进行二次封装
函数封装确定返回值,格式为 [ err, data],用户解析函数返回值即可
promise返回值正常时,函数 return [ null, data ] 用户解析返回值可获取 promise返回
promise返回异常时, 函数首先判断是否有用户自定义的异常报错返回,存在就进行对象合并,将用户自定义异常复制到promise异常,函数 return [ err, undefined ]