如何解决async await处理异常问题
写在前面
晚上睡不着,决心还是起来把今天白天工作期间反问一个小伙伴的async&await问题。实际上这个问题之前我就一直想写点什么,只是奈何懒的很,一直没有行动。今天还是忍不住想要吐糟一下,如果有什么说得不对的,欢迎批评指证!
前端项目中异步函数存在的问题
在现在的前端项目中,充斥这大量的异步操作,由于async & await的兴起,导致我今天看到小伙伴有一个项目的代码大量充斥着try catch,代码大概如下:
function request(type) {
return new Promise((resolve, reject) => {
setTimeout(() => {
type === 'a' ? resolve('resolve') : reject('reject')
}, 2000);
})
}
async function getData() {
try {
let ret1 = await request('a');
}catch(error){
// todo
}
try {
let ret2 = await request('b');
} catch (error) {
// todo
}
try {
let ret3 = await request('c');
} catch (error) {
// todo
}
}
getData();解决办法
在复杂的业务中,这种充斥很多的try catch我实在受不了。势必会想办法解决一下这个问题。 首先需要明确的是 await 后面的promise只有是一个resolve状态,才能正确的拿到其结果。那么要解决这个问题,势必要让异步返回一个resolve状态,但是错误我们不能视而不见,结合nodejs中错误优先,我们可以将错误和结果封装成一个数组返回,那么就有了如下代码了:
/**
* 高级的处理,接收一个promise,返回一个resolve状态的promise
*
* @param {*} promise
*/
const hRequest = promise => promise.then(res => [undefined, res]).catch(err => [err,undefined])
async function getData2() {
let err,result;
[err,result] = await hRequest(request('a'));
console.log(err,result);
[err,result] = await hRequest(request('b'));
console.log(err,result);
}
getData2();最后
经过这样一转换,你可以优先判断有没有错误,然后再处理你的业务。
作者:我终于失去了你
链接:https://juejin.cn/post/6912112597596635150
来源:掘金
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!