前言
使用过async和await的朋友都知道需要做异常处理,所以就会用到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) }) },
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'); } }
|
结尾
经过这样一转换,你可以优先判断有没有错误,然后再处理你的业务。
参考