個人很喜歡把async await promise try catch throw聯(lián)合使用彻亲,以達到精準控制程序流的目的孕锄,最終目的只有一個:使用主動throw/reject,大量減少return 和 if苞尝,代碼量少很多畸肆,特別是遇到函數(shù)調用很深的情況,如果要一層一層往外return 再 if判斷結果決定是否繼續(xù)執(zhí)行時宙址,是非常難受的恼除, 代碼也容易寫得非常復雜。
throw的出發(fā)點只有一個:
是否要讓程序繼續(xù)執(zhí)行下去 曼氛?不執(zhí)行下去就直接throw,讓trycatch抓住令野,終止程序流舀患。
注意:trycatch 的使用要保證當前所有調用都有序進行,確保連環(huán)調用
promise中的reject 等同于 throw
!(async function () {
try {
await new Promise((resolve, reject) => {
reject('reject 一個錯誤')
})
} catch (error) {
console.log(error) //reject 一個錯誤
}
})()
//等價于
!(async function () {
try {
await new Promise((resolve, reject) => {
throw 'throw 一個錯誤'
})
} catch (error) {
console.log(error) //throw 一個錯誤
}
})()
throw語句精準控制程序流
//示例1:終止 forEach
function forEachFn() {
const arr = [1, 2, 4, 5];
arr.forEach(item => {
if (item === 1) throw '強行終止forEach'
})
console.log('forEach next') // 不會執(zhí)行到這里
}
!(async function () {
try {
forEachFn()
console.log('forEach next2') // 不會執(zhí)行到這里
} catch (error) {
console.log(error) //強行終止forEach
}
})()
//示例2:終止 switch case
function switchCase(key) {
switch (key) {
case 1:
throw '強行終止 switch case'
}
console.log('switchCase next') // 不會執(zhí)行到這里
}
!(async function () {
try {
switchCase(1)
console.log('switchCase next2') // 不會執(zhí)行到這里
} catch (error) {
console.log(error) //強行終止 switch case
}
})()
//示例3:終止遞歸
function runRecursion(index = 1) {
if (index === 3) throw '終止遞歸'
return runRecursion(index += 1)
}
!(async function () {
try {
runRecursion()
console.log('runRecursion') // 不會執(zhí)行到這里
} catch (error) {
console.log(error) //終止遞歸
}
})()
有些同學可能會擔心trycatch 的性能問題
事實上气破,有性能問題的在于catch語句聊浅,但是可以避免。這里引用高性能javascript中給出的解決方案现使,書很老低匙,但很實在。本人用當前最新的chrome瀏覽器和微信開發(fā)者工具驗證過了碳锈,此方案可行顽冶,沒有性能問題
是否要用throw拋異常來終止程序流,爭論已久售碳,私認為强重,使用throw代碼可靠性和維護性更高绞呈,因為我們最終的目的是為了讓程序不再執(zhí)行下去,如果使用return + if的方式间景,比較容易造成誤操作佃声,萬一下面的判斷不夠準確,程序流就崩了倘要。但如果直接拋異常圾亏,開發(fā)的時候就能很明確,程序執(zhí)行到哪個節(jié)點被我們主動停下來了封拧,而且程序流也一定被終止了志鹃,這樣非常可靠哮缺。
以上有任何不對的地方弄跌,歡迎指正,謝謝你