async/await的错误处理

1,636 阅读2分钟

使用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]);
}

这种方式让代码好看了一点,作者同时在文中也提到了不应当把它当成最好的解决方案,最后应该如何进行错误处理应该按照实际的业务需求来进行。