await-to-js

130 阅读1分钟

简介

对于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 ]