一覺醒來,發現 Try catch 要被淘汰了?
相信大部分前端朋友都在項目中使用過 try catch 去編寫過代碼,其實它的最大作用就是 兜底,就比如下面的代碼,我想要在請求之后,保證頁面的正常展示不崩,那么我就得兜底:
- 確保請求報錯之后,頁面正常展示
- 確保請求到的數據是一個數組格式
那么我可以使用 try catch 這么去編寫這一個請求,這樣就能確保無論是請求失敗與否,返回的數據符合預期與否,都不會造成頁面的崩掉。
或者我們平時使用的很多的 JSON.parse,這個方法報錯率也是很高的,所以一般也都會做 兜底,防止因為此錯誤導致頁面崩掉。
ECMAScript 新提案
安全賦值運算符 ?=
最近 ECMAScript 引入了一個新的提案:proposal-safe-assignment-operator,中文翻譯為 安全賦值運算符,代碼中是 ?=。
它通過將函數的結果轉換為一個數組來處理錯誤:
- 如果函數拋出錯誤,則運算符返回[error, null]
- 如果函數成功執行,則返回[null, result]
還是以剛剛兩個代碼例子來說
圖片
圖片
可以看出比原本的代碼更加清晰簡潔。
很多人會問,為啥要將 error 放前面,而 result 放后面呢?
其實很好理解,因為并不是所有函數執行都會有返回結果的,換句話說:error是客觀存在的,result是主觀存在的,所以 error 放前面更方便,代碼判斷起來更加舒服。
Symbol.result
剛剛上面 ?= 后面都是跟著 JavaScript 自帶的方法,如果你想要讓自己寫的代碼也能享受 ?=,那么你需要用到 Symbol.result,因為當 ?= 后面需要接一個對象(可以直接是對象,也可以是函數返回對象),會自動去調用這個對象身上的 Symbol.result 方法。
圖片
圖片
遞歸處理
如下代碼,如果 ?= 處理后返回的 result 中又有 Symbol.result 的話,?= 會繼續處理這個 result ,直到所有 Symbol.result 被處理完成,或者遇到報錯。
圖片
Promise
?= 天然支持處理 Promise,不需要自己去返回 Symbol.result。