Async await处理异常问题

前言

使用过async和await的朋友都知道需要做异常处理[1],所以就会用到try catch,只要异步方法过多时,代码中就会出现很多这样的try catch,代码大概如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
getData(type){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
type == '01' ? resolve('resolve') : reject('reject');
},3000)
})
},
async asyncAwait(){
try{
let res = await this.getData('01');
console.log(res);
}catch(err){
console.log(err);
}

try{
let res = await this.getData('02');
console.log(res);
}catch(err){
console.log(err);
}

// ...
}

解决方案

在复杂的业务中,这种充斥很多的try catch我实在受不了。势必会想办法解决一下这个问题。
首先需要明确的是await后面的promise只有是一个resolve状态,才能正确的拿到其结果。那么要解决这个问题,势必要让异步返回一个resolve状态,但是错误我们不能视而不见,结合nodejs错误优先,我们可以将错误和结果封装成一个数组返回,那么就有了如下代码了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
getData(type){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
type == '01' ? resolve('resolve') : reject('reject');
},3000)
})
},
/**
* 高级的处理,接收一个promise,返回一个resolve状态的promise
*
* @param {*} promise
*/
dataHandler(promise){
return promise.then(res=>[undefined,res]).catch(err=>[err,undefined])
},

async asyncAwait(){
let err,res;
[err,res] = await this.dataHandler(this.getData('01'));
if(err){
console.log('1报错');
}else{
console.log('业务处理1');
}

[err,res] = await this.dataHandler(this.getData('02'));
if(err){
console.log('2报错');
}else{
console.log('业务处理2');
}
}

结尾

经过这样一转换,你可以优先判断有没有错误,然后再处理你的业务。

参考


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!