最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于JavaScript異常捕獲的幾點(diǎn)建議

 更新時(shí)間:2026年06月10日 09:31:02   作者:卷簾依舊  
為了解決JavaScript回調(diào)地獄的問題,ES6+引入了Promise,通過將返回值代理到Promise中,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

為了解決JavaScript回調(diào)地獄的問題,ES6+引入了Promise,通過將返回值代理到Promise中,并結(jié)合pending, rejected, fulfilled三種狀態(tài)的轉(zhuǎn)化返回Promise,將異步的返回值存儲(chǔ)在未來某一時(shí)刻可以用到的promise中,方便解析。

Promise通過then()鏈的方式調(diào)用,發(fā)生錯(cuò)誤時(shí)通過rejected promise傳遞錯(cuò)誤,可以像try...catch一樣捕獲和處理異常,但是使用不當(dāng)可能導(dǎo)致意料之外的行為,本文列舉了一些常見的使用錯(cuò)誤,在使用中應(yīng)當(dāng)注意。

1.then鏈?zhǔn)秸{(diào)用異步,捕獲不到異常

????現(xiàn)象:在.then()鏈中調(diào)用異步函數(shù),某些調(diào)用方式不同會(huì)導(dǎo)致捕獲不到異步拋出的異常

異步函數(shù)異常捕獲demo-sandbox

const before = () => {
    const p = new Promise((resolve, reject) => {
        // resolve('before')
        console.log('ok');
        reject(new Error('error!!!'));
    });
    return p;
};
const handleClick = () => {
    const p = new Promise((resolve, reject) => {
        resolve(true);
    });
    p
        // ? catch不到
        .then(() => {
            before(); 
        })
        // .then(before)
        // .then(async () => {
        //   await before();
        // })
        .then(() => {
            console.log('then');
        })
        .catch(e => {
            console.error(e);
        });
};

??原因

缺少return語(yǔ)句:before()沒有return,返回undefined,無錯(cuò)誤拋出,后續(xù)的then鏈會(huì)繼續(xù)執(zhí)行,但是因?yàn)殄e(cuò)誤沒有被捕獲/正確處理,會(huì)導(dǎo)致頁(yè)面或應(yīng)用程序崩潰。

?疑惑

rejected promise不就是異常嗎,那為什么沒有觸發(fā)呢?

?? The return is implicit under some circumstances

實(shí)際上rejected promise并不是異常,如果不被return出去,就不會(huì)觸發(fā)error機(jī)制(類似的,如果創(chuàng)建一個(gè)新的錯(cuò)誤對(duì)象,但是沒有throw,那么同樣也不會(huì)觸發(fā)異常)

實(shí)際上,rejected promise并不是異常,如果沒有return出去,那么就不會(huì)觸發(fā)error

2. try...catch無法捕獲異步函數(shù)中通過return返回的rejected error.

????需要使用await接收異步函數(shù)的返回,再將結(jié)果return出去

const a = async () => {
    return new Promise((resolve, reject) => {
        reject('error')
    })
};
const b = async () => {
    try {
        // ?捕獲不到
        // return a();
        const res = await a();
        return res;
    }
    catch (e) {
        console.log('catch exception!!!')
    }
}
b();

3. 在Promise的構(gòu)造函數(shù)中使用async會(huì)導(dǎo)致異常捕獲不到

let p = new Promise(resolve => {
  ""(); // TypeError
  resolve();
});
(async () => {
  await p;
})().catch(e => console.log("Caught: " + e)); // Catches it.
let p = new Promise(async resolve => {
  ""(); // TypeError
  resolve();
});
(async () => {
  await p;
})().catch(e => console.log("Caught: " + e)); // Doesn't catch it!

??第一段代碼能夠捕獲到異常,因?yàn)楫惓S蒔romise的構(gòu)造函數(shù)直接reject出去;第二段代碼不能,因?yàn)閍sync關(guān)鍵字會(huì)隱式生成一個(gè)新的promise,由async函數(shù)自身處理。

4.JavaScript Reject V.S. Throw

都是用于拋出異常,reject和throw有什么區(qū)別,適用于什么場(chǎng)景

先簡(jiǎn)單對(duì)比一下:

  • 都可用于觸發(fā)錯(cuò)誤機(jī)制
  • reject是promise的一部分,結(jié)合promise使用;throw不受限制
  • throw之后的語(yǔ)句都不會(huì)執(zhí)行了,reject之后的語(yǔ)句會(huì)正常執(zhí)行,但如果reject前邊有return,那么其后的語(yǔ)句同樣也不會(huì)繼續(xù)執(zhí)行

但實(shí)際上,這倆并沒有優(yōu)劣之分,但是在某種場(chǎng)景下throw是無效的。在promise的回調(diào)中throw可以正常使用,一旦出現(xiàn)異步,throw就無效了。

比如:

new Promise(function() {
  setTimeout(function() {
    throw 'or nah';
    // return Promise.reject('or nah'); also won't work
  }, 1000);
}).catch(function(e) {
  console.log(e); // doesn't happen
});

正確捕獲的方式:

new Promise((resolve, reject) => {
  setTimeout(function() {
    reject('or nah');
  }, 1000);
}).catch(function(e) {
  console.log(e); // works
});

5. 異常的正確處理方式

異常需要被正確捕獲。

  • 嵌套的try...catch

    如果代碼中有嵌套的try...catch,那么異常會(huì)被內(nèi)部的catch捕獲:內(nèi)層異常被處理,那么外層就捕獲不到了;內(nèi)層直接throw,那么內(nèi)層try...catch無意義

  • .then鏈的異常捕獲,需要保證異常在UI層被捕獲。

    不要過早的吞掉異常,需要保證catch在最終調(diào)用處調(diào)用,避免異常暴露導(dǎo)致程序或頁(yè)面崩潰。

小結(jié)

  • rejected promise和throw都可用于觸發(fā)異常,沒有優(yōu)劣之分;
  • promise回調(diào)中存在異步,那么rejected promise必要要return出去才可被后續(xù)處理,否則返回undefined,即使存在異常也不會(huì)被處理,會(huì)導(dǎo)致頁(yè)面或應(yīng)用程序崩潰;
  • promise回調(diào)中的異步函數(shù),執(zhí)行結(jié)果需要被return出去異常才會(huì)被捕獲:要么直接作為回調(diào)參數(shù),要么使用async...await執(zhí)行,要么使用return
  • 捕獲promise回調(diào)中異步函數(shù)的異常,throw是無效的,創(chuàng)建一個(gè)新的rejected promise也是無效的,需要使用當(dāng)前promise的rejecte函數(shù)
  • 在promise的構(gòu)造函數(shù)中使用async關(guān)鍵字會(huì)導(dǎo)致異常捕獲不到,因?yàn)閍sync關(guān)鍵字會(huì)隱式生成一個(gè)新的promise,由async函數(shù)自身處理

到此這篇關(guān)于關(guān)于JavaScript異常捕獲的幾點(diǎn)建議的文章就介紹到這了,更多相關(guān)JavaScript異常捕獲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 小程序獲取當(dāng)前位置加搜索附近熱門小區(qū)及商區(qū)的方法

    小程序獲取當(dāng)前位置加搜索附近熱門小區(qū)及商區(qū)的方法

    這篇文章主要介紹了小程序獲取當(dāng)前位置加搜索附近熱門小區(qū)及商區(qū)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • 基于javascript的異步編程實(shí)例詳解

    基于javascript的異步編程實(shí)例詳解

    這篇文章主要介紹了基于javascript的異步編程,結(jié)合實(shí)例形式分析了javascript異步編程的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-04-04
  • JavaScript判斷變量是否為數(shù)組的方法(Array)

    JavaScript判斷變量是否為數(shù)組的方法(Array)

    這篇文章主要介紹了JavaScript判斷變量是否為數(shù)組的方法(Array),涉及到j(luò)avascript 數(shù)組 變量相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02
  • CSS常用網(wǎng)站布局實(shí)例

    CSS常用網(wǎng)站布局實(shí)例

    PS:這里列出的是常用的例子,而非研究之用,對(duì)一每個(gè)盒子,都沒有設(shè)置margin,padding,boeder等屬性!
    2008-04-04
  • 小程序開發(fā)中如何使用async-await并封裝公共異步請(qǐng)求的方法

    小程序開發(fā)中如何使用async-await并封裝公共異步請(qǐng)求的方法

    在平常的項(xiàng)目開發(fā)中肯定會(huì)遇到同步異步執(zhí)行的問題,這篇文章主要介紹了小程序開發(fā)中如何使用async-await并封裝公共異步請(qǐng)求的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 自己做的模擬模態(tài)對(duì)話框?qū)崿F(xiàn)代碼

    自己做的模擬模態(tài)對(duì)話框?qū)崿F(xiàn)代碼

    最近做完一個(gè)項(xiàng)目,發(fā)現(xiàn)瀏覽器兼容問題,模態(tài)對(duì)話框只有IE支持,但是IE9又不能支持帶框架的對(duì)話框,那個(gè)對(duì)話框的大小打死都設(shè)置不了,在網(wǎng)上查說因?yàn)楹枚喙δ鼙籌E9屏蔽了,于是自己做了一個(gè)模擬對(duì)話框的東西
    2012-05-05
  • 深度解析JavaScript對(duì)象繼承

    深度解析JavaScript對(duì)象繼承

    JavaScript中的對(duì)象繼承是構(gòu)建靈活、可維護(hù)代碼的關(guān)鍵部分,本文主要介紹了深度解析JavaScript對(duì)象繼承,包括原型鏈繼承、構(gòu)造函數(shù)繼承、組合繼承等,感興趣的可以了解一下
    2024-01-01
  • 移動(dòng)前端圖片壓縮上傳的實(shí)例

    移動(dòng)前端圖片壓縮上傳的實(shí)例

    下面小編就為大家分享一篇移動(dòng)前端圖片壓縮上傳的實(shí)例。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起小編過來看看吧
    2017-12-12
  • 前端兼容性問題全面解決方案示例代碼

    前端兼容性問題全面解決方案示例代碼

    市場(chǎng)上瀏覽器種類很多,不同瀏覽器的內(nèi)核也不盡相同,所以各個(gè)瀏覽器對(duì)網(wǎng)頁(yè)的解析存在一定的差異,這篇文章主要介紹了前端兼容性問題全面解決方案的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • javascript稀疏數(shù)組(sparse array)和密集數(shù)組用法分析

    javascript稀疏數(shù)組(sparse array)和密集數(shù)組用法分析

    這篇文章主要介紹了javascript稀疏數(shù)組(sparse array)和密集數(shù)組用法,分析javascript稀疏數(shù)組和密集數(shù)組的功能、定義與使用方法,需要的朋友可以參考下
    2016-12-12

最新評(píng)論

嘉义县| 温泉县| 雅安市| 政和县| 玛曲县| 广昌县| 杭锦旗| 静宁县| 曲周县| 登封市| 台北市| 福州市| 射阳县| 和静县| 屏东县| 准格尔旗| 建德市| 和平县| 平武县| 札达县| 开远市| 榆中县| 朝阳市| 武鸣县| 峡江县| 虹口区| 蕉岭县| 平潭县| 兴隆县| 邯郸市| 芷江| 浦北县| 济宁市| 泽库县| 商河县| 肥西县| 宁南县| 禹城市| 云浮市| 三江| 慈溪市|