有一个关于 async
的写法问题, 如下:
定义了一个 api, fetchUser()
, 可以有两种写法:
第一种, 不进行错误的显示处理
const fetchUser = async () => {
const res = await axios.get('https://example.com')
return res.data
}
第二种, 使用try..catch
包裹
const fetchUser = async () => {
try {
const res = await axios.get('https://example.com')
return res.data
} catch (e) {
throw e.response
}
}
使用上貌似没有差别, 如下:
fetchUser()
.then(user => console.log(user))
.catch(err => console.error(err))
个人的疑惑在于错误的捕获和处理, 个人理解在于, 只要是出现了错误, 那么返回的 promise 对象就变成 reject, 只是第二个使用了 catch 捕获后包裹了一下错误信息再手动抛出. 第一种少些了一点代码...
所以想请教一下:
- 这两种写法有没有具体的差别, 或者说, 再更加复杂的异步情况下会有哪些不同?
- 使用哪种写法更加优雅?
若能解答, 不胜感激, 多谢!
在你这个情景下对调用者来说2个函数没差,你捕获错误又原样抛出多此一举。
但在大规模应用下你最外层得套一层
try catch
来统一处理错误吧?这个时候第二种写法就很有用了,可以额外加error_message
再throw
出去,让最外层迅速知道发生错误的是什么原因,问题出现在哪个函数,给出准确提示。你如果不做二次try catch
封装想实现这种效果就难度大了。