亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于 promise 和 async/await 寫法問題?萬分感謝

關于 promise 和 async/await 寫法問題?萬分感謝

飲歌長嘯 2019-11-03 09:45:42
有一個關于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貢獻1853條經驗 獲得超18個贊

在你這個情景下對調用者來說2個函數沒差,你捕獲錯誤又原樣拋出多此一舉。
但在大規模應用下你最外層得套一層trycatch來統一處理錯誤吧?這個時候第二種寫法就很有用了,可以額外加error_message再throw出去,讓最外層迅速知道發生錯誤的是什么原因,問題出現在哪個函數,給出準確提示。你如果不做二次trycatch封裝想實現這種效果就難度大了。
                            
查看完整回答
反對 回復 2019-11-03
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

你的問題不是不知道async/await與Promise的區別,是不知道怎么寫try...catch...。
try...catch...的目的是捕獲錯誤,并進行處理。發生錯誤意味著開發者不知道接下來怎么做,只能拋出錯誤,讓其它開發者處理。捕獲錯誤意味你明白接下來的代碼有一些風險,你也打算處理發生的錯誤。
具體到你的例子里,httprequest可能面臨網絡斷開、服務器出錯、返回數據格式不對等錯誤,所以我們可以捕獲這些錯誤,給出對應的提示。比如網絡斷開,就讓用戶聯網;服務器出錯,讓用戶等下再試試;格式不對,讓用戶反饋問題給某某。至于你怎么寫,用async/await還是promise,無所謂,沒有什么區別。
但是你catch之后再拋出就莫名其妙了。
                            
查看完整回答
反對 回復 2019-11-03
  • 2 回答
  • 0 關注
  • 334 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號