返回Promise物件的函式,函式內部記得加try catch!

羅兄發表於2020-11-12

經驗總結

如題,函式內部實現記得加try catch的具體意思是,在函式的實現流程中,最外層需要加個try catch並在catch中呼叫reject(err)介面,確定返回的promise是有回撥的。本質需求是函式的所有分支的結束需要呼叫resolve或reject,確保你的promise是有回撥的,否側你是給自己或者團隊成員挖坑了!
程式碼示例

//ts程式碼
public async fun() : Promise<any> {
return new Promise<any>( async(resolve, reject) => {
    //最外層
	try {
		resolve("ok")
	} catch (e) {
		reject(e)
	}
}
}

如下截圖來自async/await ES6 Promise 的最佳實踐(經驗分享)
在這裡插入圖片描述
如果在微信小程式開發者工具的console中看 “Uncaught (in promise) thirdScriptError”
在這裡插入圖片描述
就意味著你們程式碼中或呼叫的介面(第三方SDK)使用Promise時沒有使用try catch了

建議:有關Promise的最佳實踐,推薦大家一起來學習我下面收集的文章(參考文件

經驗來源

在修復使用SocketTask,棄用wx 後,測試同事反饋 SDK的某些介面在斷網的時候呼叫沒有返回值(沒有相關的日誌輸出),然後自己去擼SDK的程式碼。由於之前也不是專門寫JS程式碼的,同時對SDK的業務邏輯也不熟悉,所以還是採用了較低效的日誌輸出,去查排查問題的程式碼點。因為方法的內部流程中又呼叫了返回值是promise的介面,即promise是多層巢狀的 (這個當時頭就大了,直覺告訴我,這不可能是最佳實踐呀!)
在二分法的原側下不斷的加日誌輸出,最後定位到是巢狀的第二層promsie的函式內部沒有加try catch,然後在斷網的情況下,觸發了邏輯上的異常,導致沒有reject或resolve的回撥。最終最外層的介面亦沒有回撥。

如下是網上有關巢狀promise的建議

在這裡插入圖片描述

參考文件

相關文章