您现在的位置是:首页 >学无止境 >js如何处理async await 的错误,多个的时候呢网站首页学无止境
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接受两个参数promise和errorExt,第一个参数是你调用接口返回的必须是一个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函数里面进行调用
但是得考虑一个问题,这个参数有可能也有参数,这个怎么办,所以必须在外忙调用,返回的数据,就可以用数组的解构,就可以拿到了,然后就是处理处理了