您现在的位置是:首页 >学无止境 >js如何处理async await 的错误,多个的时候呢网站首页学无止境

js如何处理async await 的错误,多个的时候呢

井底的蜗牛 2023-06-13 00:00:03
简介js如何处理async await 的错误,多个的时候呢

我们在开发过程中,一般都是用try catch 来捕捉错误,但是如果是下面这种情况,就只能捕捉第一个错误,后面的错误都捕捉不到,除非第一个没有错

function req1() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('error1');
            // resolve('data1');
        }, 2000);
    });
}

function req2() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('error2');
            // resolve('data2');
        }, 2000);
    });
}

async function req() {
    try {
        const res1 = await req1();
        console.log(res1);
        const res2 = await req2();
        console.log(res2);
    } catch (error) {
        console.log(error);
    }
}


像这种情况,如果后面的都报错了,那怎么去捕捉,难道要写两个try catch吗

async function req() {
    try {
        const res1 = await req1();
        console.log(res1);
        const res2 = await req2();
        console.log(res2);
    } catch (error) {
        console.log(error);
    }
    try {
        const res2 = await req2();
        console.log(res2);
    } catch (error) {
        console.log(error);
    }

}


虽然这样可以,但是代码看上去就不是一个牛逼人写的,当然也会有人说,一般都不写,一般都是拿到res1的结果传递给req2()

来进行操作,但是用两try catch根本就拿不到第一个try里面的值,但是有人会说,你可以把这个res1定义到try catch外面去

确实可以,也就是下面每一个变量都得定义到外面,看上去就不好

async function req() {
    let res1
    try {
        res1 = await req1();
        console.log(res1);
    } catch (error) {
        console.log("错误", error);
    }
    try {
        console.log(res1)
        const res2 = await req2(res1);
        console.log(res2);
    } catch (error) {
        console.log(error);
    }
}


来我们来看看牛逼的人是怎么写的,如何捕捉错误,有那么一小撮人,就喜欢搞研究,然后就高出来一个await-to-js

就这么几行代码,就把这个问题解决了,来看看代码

function toAwait<T, U = Error> (
    promise: Promise<T>,
    errorExt?: object
): Promise<[U, undefined] | [null, T]> {
    return promise
            .then<[null, T]>((data: T) => [null, data])
            .catch<[U, undefined]>((err: U) => {
            if (errorExt) {
            const parsedError = Object.assign({}, err, errorExt);
            return [parsedError, undefined];
            }
    
          return [err, undefined];
    });
}


解析一下:函数toAwait接受两个参数promiseerrorExt,第一个参数是你调用接口返回的必须是一个Promise对象,第二个就是你想要的错误信息,可传可不传,但该参数也必须是对象

如果第一个参数返回成功(resolve)时,改函数toAwait就返回[null,data],如果第一个参数返回的是异常,则进行errorExt判断,有值就把这个值和异常的err值合并

然后返回[合并的值,undefined];errorExt没值就直接返回catch的错误信息[err,undefined],是不是很简单,

好,接下来我们就来试试,如何使用,怎么下载这个,我这里就不多介绍,都是大佬,看文档就可以了

async function req() {
    // try {
    //   const res1 = await req1();
    //   console.log(res1);
    // } catch (error) {
    //   console.log(error);
    // }
    // try {
    //  
    // } catch (error) {
    //   console.log(error);
    // }
    const [err, data] = await toAwait(req1());
    console.log(err, data)
    const [err2, data2] = await toAwait(req2());
    console.log(err2, data2)
}


在使用的时候直接调用这个toAwait方法,把请求的函数传入并且调用,当然也可以不调用,在这个toAwait函数里面进行调用

但是得考虑一个问题,这个参数有可能也有参数,这个怎么办,所以必须在外忙调用,返回的数据,就可以用数组的解构,就可以拿到了,然后就是处理处理了

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。