淺析JavaScrip如何實(shí)現(xiàn)優(yōu)雅地退出函數(shù)
前言
退出函數(shù)怎么寫?有人會(huì)說一個(gè) return
就退出函數(shù)了,有這么簡單嗎?來看一個(gè)表單校驗(yàn)和提交結(jié)果的函數(shù):
// 表單校驗(yàn) function validate() {} // 提交表單 function submit() { validate();// ?如果表單校驗(yàn)失敗怎么退出函數(shù)呢? fetch("/api/submit", { // ... }); }
如果表單校驗(yàn)失敗怎么退出函數(shù)呢?傳統(tǒng)的思維方式必然是使用return
解決,讓 validate 函數(shù)返回一個(gè)值來判斷是退出函數(shù)還是繼續(xù)執(zhí)行:
function validate() {} function submit() { + if (!validate()) { + return; + } fetch("/api/submit", { // ... }); }
這樣解決是可以的,但是不夠優(yōu)雅,為什么呢?因?yàn)?validate 函數(shù)本身是不需要返回值的,現(xiàn)在卻為了功能必須添加一個(gè)返回值,并且 submit 函數(shù)還依賴于 validate 的返回值,增加了函數(shù)之間的耦合度。如何優(yōu)雅地退出函數(shù),這就是今天的主題。
拋出異常
第一個(gè)方法當(dāng)然是拋出異常,這一招我屢試不爽,還是上面那個(gè)案例,先看看如何通過拋出異常退出函數(shù):
// 表單校驗(yàn) function validate() { + throw new Error("驗(yàn)證失敗"); } // 提交表單 function submit() { validate();// ?如果表單校驗(yàn)失敗怎么退出函數(shù)呢? fetch("/api/submit", { // ... }); }
如果 submit 還有其他很多流程并且這些流程中的某個(gè)分支也需要退出整個(gè) submit 函數(shù),使用拋出異常退出函數(shù)的話就不需要寫那么多的 if else 了,例如:
// 提交表單 function submit() { validate();// ?如果表單校驗(yàn)失敗怎么退出函數(shù)呢? doSomething1(); doSomething2(); fetch("/api/submit", { // ... }); }
但是這種方式也有一個(gè)弊端,那就是帶來了控制臺(tái)的爆紅,不過一看就看得出來這不是程序報(bào)錯(cuò)導(dǎo)致的,是我們手動(dòng)拋出的:
拋出異常這種方式在異步函數(shù)中同樣適用,但是需要改變寫法,先來看看不改變寫法會(huì)怎么樣:
+ async function validate() { throw new Error("validate failed"); } + async function submit() { validate(); fetch("/api/submit", { // ... }); }
咦,為什么拋出異常不生效了呢,要解答這個(gè)問題,首先得把這段代碼“翻譯”一下:
function validate() { + return Promise.reject(new Error("validate failed")); }
顯然這里函數(shù)沒有真正拋出異常,而是被 Promise 攔截掉了,導(dǎo)致退出函數(shù)
失敗。這里只需要增加一個(gè) await 就可以退出函數(shù)了:
async function submit() { + await validate(); fetch("/api/submit", { // ... }); }
異步函數(shù) reject
上面說了拋出異??梢酝顺霎惒胶瘮?shù),但是不僅僅這一種方式,還可以通過 Promise.reject 退出異步函數(shù):
async function validate() { return Promise.reject(); }
所以如果想退出函數(shù)可以先將函數(shù)改為 async 函數(shù),然后返回一個(gè) reject 狀態(tài)的 Promise,這樣就能夠退出函數(shù)了。
總結(jié)
最后,總結(jié)一下所有退出函數(shù)的方法:
- 函數(shù)返回一個(gè)布爾值,根據(jù)這個(gè)布爾值判斷是否 return 退出函數(shù)
- 拋出異常退出函數(shù),注意異步函數(shù)需要加上 await,否則無法退出
- 將普通函數(shù)轉(zhuǎn)為異步函數(shù),然后返回一個(gè) reject 狀態(tài)的 Promise,也可以實(shí)現(xiàn)退出函數(shù)的目的
到此這篇關(guān)于淺析JavaScrip如何實(shí)現(xiàn)優(yōu)雅地退出函數(shù)的文章就介紹到這了,更多相關(guān)JavaScrip退出函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家
相關(guān)文章
TypeScript環(huán)境搭建并且部署到VSCode的詳細(xì)步驟
本文給大家介紹TypeScript環(huán)境搭建并且部署到VSCode的詳細(xì)步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-11-11js屏蔽F12審查元素,禁止修改頁面代碼等實(shí)現(xiàn)代碼
有時(shí)候我們需要屏蔽客戶端的F12,以防菜鳥也可以隨意修改我們的代碼,也處于源碼的保護(hù)等操作,這里就為大家分享一下常見的代碼2020-10-10Javascript中引用類型傳遞的知識(shí)點(diǎn)小結(jié)
這篇文章主要給大家介紹了關(guān)于Javascript中引用類型傳遞的知識(shí)點(diǎn),文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03微信小程序如何通過用戶授權(quán)獲取手機(jī)號(hào)(getPhoneNumber)
這篇文章主要介紹了微信小程序如何通過用戶授權(quán)獲取手機(jī)號(hào)(getPhoneNumber),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01基于JS實(shí)現(xiàn)禁止查看源碼及獲取鍵盤的按鍵值
這篇文章主要介紹了基于JS實(shí)現(xiàn)禁止查看源碼及獲取鍵盤的按鍵值,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02鴻蒙系統(tǒng)中實(shí)現(xiàn)圖片上傳功能全流程
在鴻蒙系統(tǒng)中實(shí)現(xiàn)圖片上傳功能,整體流程可以類比為?“選快遞→填單→發(fā)貨→簽收”?的過程,下面給大家介紹鴻蒙系統(tǒng)中實(shí)現(xiàn)圖片上傳功能全流程,感興趣的朋友一起看看吧2025-04-04JS實(shí)現(xiàn)向iframe中表單傳值的方法
這篇文章主要介紹了JS實(shí)現(xiàn)向iframe中表單傳值的方法,涉及js針對(duì)頁面元素及表單屬性操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03JS圖片懶加載技術(shù)實(shí)現(xiàn)過程解析
這篇文章主要介紹了JS圖片懶加載技術(shù)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07