[轉帖]async/await 函數(shù)到底要不要加 try catch ?
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
前言寫異步函數(shù)的時候,promise 和 async 兩種方案都非常常見,甚至同一個項目里,不同的開發(fā)人員都使用不同的習慣, 不過關于兩者的比較不是本文關注的重點,只總結為一句話:“async 是異步編程的終極解決方案”。 當使用 async 函數(shù)的時候,很多文章都說建議用 我們先看下使用 try catch 情況下的代碼示例: 示例1 :使用 try catchfunction getUserInfo () { return new Promise((resolve, reject) => { setTimeout(() => { reject('請求異常') }, 1000) }) } async function logined () { try { let userInfo = await getUserInfo() // 執(zhí)行中斷 let pageInfo = await getPageInfo(userInfo?.userId) } catch(e) { console.warn(e) } } logined() 執(zhí)行后會在 catch 里捕獲 示例2: 直接 catch鑒于正常情況下, function getUserInfo () { return new Promise((resolve, reject) => { setTimeout(() => { reject('請求異常') }, 1000) }) } async function logined () { let userInfo = await getUserInfo().catch(e => console.warn(e)) // 執(zhí)行沒有中斷,userInfo 為 undefined if (!userInfo) return // 需要做非空校驗 let pageInfo = await getPageInfo(userInfo?.userId) } logined() 執(zhí)行后 catch 可以正常捕獲異常,但是程序沒有中斷,返回值 示例3:在 catch 里 reject可以繼續(xù)優(yōu)化,在 catch 里面加一行 完整代碼: function getUserInfo () { return new Promise((resolve, reject) => { setTimeout(() => { reject('請求異常') }, 1000) }) } async function logined () { let userInfo = await getUserInfo().catch(e => { console.warn(e) return Promise.reject(e) // 會導致控制臺出現(xiàn) uncaught (in promise) 報錯信息 }) // 執(zhí)行中斷 let pageInfo = await getPageInfo(userInfo?.userId) } logined() 一般我們在項目里都是用 axios 或者 fetch 之類發(fā)送請求,會對其進行一個封裝,也可以在里面進行 catch 操作,對錯誤信息先一步處理,至于是否需要 reject,就看你是否想要在 await 命令異常時候中斷了;不使用 reject 則不會中斷,但是需要每個接口拿到 response 后先 非空校驗, 使用 reject 則會在異常處中斷,并且會在控制臺暴露 建議不需要在 await 處異常時中斷,可以這樣寫,需要做非空校驗,控制臺不會有報錯信息 let userInfo = await getUserInfo().catch(e => console.warn(e)) if (!userInfo) return 需要在 await 處異常時中斷,并且在意控制臺報錯,可以這樣寫 try { let userInfo = await getUserInfo() // 執(zhí)行中斷 let pageInfo = await getPageInfo(userInfo?.userId) } catch(e) { console.warn(e) } 需要在 await 處異常時中斷,但是不在意控制臺報錯,則可以這樣寫 let userInfo = await getUserInfo().catch(e => { console.warn(e) return Promise.reject(e) // 會導致控制臺出現(xiàn) uncaught (in promise) 報錯信息 }) // 執(zhí)行中斷 let pageInfo = await getPageInfo(userInfo?.userId) 總結幾種寫法,初看可能覺得第三種 catch 這種寫法是最好的,但是細想下,從用戶體驗上來看,我覺得 try catch 是最好的,邏輯直觀、符合同步編程思維,控制臺不會暴露 而鏈式調用的 catch (里面再 reject),是傳統(tǒng) promise 的回調寫法,既然已經(jīng)用 async await 這種同步編程寫法了,再用 catch 鏈式寫法,感覺沒必要。 該文章在 2023/7/24 17:17:44 編輯過 |
關鍵字查詢
相關文章
正在查詢... |