js 精準控制程序流 async await promise try catch throw

個人很喜歡把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ā)者工具驗證過了碳锈,此方案可行顽冶,沒有性能問題


《高性能javascript》.png
《高性能javascript》.png

是否要用throw拋異常來終止程序流,爭論已久售碳,私認為强重,使用throw代碼可靠性和維護性更高绞呈,因為我們最終的目的是為了讓程序不再執(zhí)行下去,如果使用return + if的方式间景,比較容易造成誤操作佃声,萬一下面的判斷不夠準確,程序流就崩了倘要。但如果直接拋異常圾亏,開發(fā)的時候就能很明確,程序執(zhí)行到哪個節(jié)點被我們主動停下來了封拧,而且程序流也一定被終止了志鹃,這樣非常可靠哮缺。

以上有任何不對的地方弄跌,歡迎指正,謝謝你

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尝苇,一起剝皮案震驚了整個濱河市铛只,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌糠溜,老刑警劉巖淳玩,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異非竿,居然都是意外死亡蜕着,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門红柱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來承匣,“玉大人,你說我怎么就攤上這事锤悄∪推” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵零聚,是天一觀的道長袍暴。 經(jīng)常有香客問我,道長隶症,這世上最難降的妖魔是什么政模? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蚂会,結果婚禮上淋样,老公的妹妹穿的比我還像新娘。我一直安慰自己颂龙,他們只是感情好习蓬,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布纽什。 她就那樣靜靜地躺著,像睡著了一般躲叼。 火紅的嫁衣襯著肌膚如雪芦缰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天枫慷,我揣著相機與錄音让蕾,去河邊找鬼。 笑死或听,一個胖子當著我的面吹牛探孝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播誉裆,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼顿颅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了足丢?” 一聲冷哼從身側響起粱腻,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斩跌,沒想到半個月后绍些,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡耀鸦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年柬批,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袖订。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡氮帐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洛姑,到底是詐尸還是另有隱情揪漩,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布吏口,位于F島的核電站,受9級特大地震影響冰更,放射性物質發(fā)生泄漏产徊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一蜀细、第九天 我趴在偏房一處隱蔽的房頂上張望舟铜。 院中可真熱鬧,春花似錦奠衔、人聲如沸谆刨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痊夭。三九已至刁岸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間她我,已是汗流浹背虹曙。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留番舆,地道東北人酝碳。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像恨狈,于是被迫代替她去往敵國和親疏哗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 書名:《掌控習慣》 推薦理由:摘抄:要想使自己做到最好禾怠,你需要持續(xù)編輯你的信念返奉,升級和擴展你的身份。而習慣是改變身...
    簡單生活7568閱讀 411評論 0 0
  • 一耗一上午刃宵,我都不知道干啥來了衡瓶,完全沒必要啊這是,服了牲证,還互聯(lián)網(wǎng)轉型呢哮针,就你這辦事效率,轉個十年都夠嗆
    夏普1658閱讀 106評論 0 0
  • O_e990閱讀 63評論 0 0
  • 由于單位離家有點遠坦袍,中午都是在單位休息不回家十厢,中午想女兒時就會拿出手機里的照片視頻來看看。我是一個不愛曬娃的人...
    28f5a821fc22閱讀 118評論 0 0
  • 今天是什么日子 起床:05:50 就寢:22:30 天氣:晴 心情:有波瀾 紀念日:無 任務清單 昨日完成的任務捂齐,...
    內(nèi)心期待寧靜閱讀 148評論 0 1