使用async/await来进行异步请求是常用的方式了,因为它可以使我们的代码看起来是同步的,代码组织会更优雅。在实际的开发中,我们还面临一个问题,怎么进行错误处理?
关于错误处理
promise可以用catch来进行错误处理,代码如下:
const fetchList = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('hello world')
}, 1000)
})
}
fetchList().then(res => {
//正确逻辑代码
}).catch(err => {
//错误处理
})
当我们使用async/await,我们通常使用的是try/catch方式来处理:
try {
const data = await fetchList();
} catch(e){
console.log(e)
}
如果只是一个异步请求还好说,如果是多个的话我们岂不是要写很多个同样的try/catch,代码看起来太冗杂了。当然,我们可以只用一个try/catch来解决问题,代码如下:
try{
const data1 = await fetchList1();
const data2 = await fetchList2();
...
} catch(e){
console.log(e)
}
如果你对每个请求的错误处理都是一致的,这种方案没什么大问题。但是如果想捕捉到错误到底是哪个请求抛出的,就有点捉襟见肘。
await-to-js解决方案
理想化的解决方案是,不用写重复的try/catch,能得到正确/错误的反馈。async/await说到底就是个promise,我们同样可以通过then/catch来做处理,封装成公共函数就不用多次写try/catch.
一个开发小哥借鉴go的语法,提出了更优雅的处理方式,文章在这:How to write async await without try-catch blocks in Javascript。核心代码非常简单:
export default function to(promise) {
return promise.then(data => {
return [null, data];
})
.catch(err => [err]);
}
这种方式让代码好看了一点,作者同时在文中也提到了不应当把它当成最好的解决方案,最后应该如何进行错误处理应该按照实际的业务需求来进行。