为了账号安全,请及时绑定邮箱和手机立即绑定

关于 promise 和 async/await 写法问题?跪求!

关于 promise 和 async/await 写法问题?跪求!

凤凰求蛊 2019-10-25 20:01:36
有一个关于async的写法问题,如下:定义了一个api,fetchUser(),可以有两种写法:第一种,不进行错误的显示处理constfetchUser=async()=>{constres=awaitaxios.get('https://example.com')returnres.data}第二种,使用try..catch包裹constfetchUser=async()=>{try{constres=awaitaxios.get('https://example.com')returnres.data}catch(e){throwe.response}}使用上貌似没有差别,如下:fetchUser().then(user=>console.log(user)).catch(err=>console.error(err))个人的疑惑在于错误的捕获和处理,个人理解在于,只要是出现了错误,那么返回的promise对象就变成reject,只是第二个使用了catch捕获后包裹了一下错误信息再手动抛出.第一种少些了一点代码...所以想请教一下:这两种写法有没有具体的差别,或者说,再更加复杂的异步情况下会有哪些不同?使用哪种写法更加优雅?若能解答,不胜感激,多谢!
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

在你这个情景下对调用者来说2个函数没差,你捕获错误又原样抛出多此一举。
但在大规模应用下你最外层得套一层trycatch来统一处理错误吧?这个时候第二种写法就很有用了,可以额外加error_message再throw出去,让最外层迅速知道发生错误的是什么原因,问题出现在哪个函数,给出准确提示。你如果不做二次trycatch封装想实现这种效果就难度大了。
                            
查看完整回答
反对 回复 2019-10-25
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

你的问题不是不知道async/await与Promise的区别,是不知道怎么写try...catch...。
try...catch...的目的是捕获错误,并进行处理。发生错误意味着开发者不知道接下来怎么做,只能抛出错误,让其它开发者处理。捕获错误意味你明白接下来的代码有一些风险,你也打算处理发生的错误。
具体到你的例子里,httprequest可能面临网络断开、服务器出错、返回数据格式不对等错误,所以我们可以捕获这些错误,给出对应的提示。比如网络断开,就让用户联网;服务器出错,让用户等下再试试;格式不对,让用户反馈问题给某某。至于你怎么写,用async/await还是promise,无所谓,没有什么区别。
但是你catch之后再抛出就莫名其妙了。
                            
查看完整回答
反对 回复 2019-10-25
  • 2 回答
  • 0 关注
  • 405 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信