成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

async/await 中的 try/catch

褰辯話 / 416人閱讀

摘要:定時(shí)器為狀態(tài)聲明的函數(shù)配合按步驟自動(dòng)執(zhí)行類型自動(dòng)執(zhí)行器執(zhí)行或者,使用捕獲異常若是狀態(tài),拋出異常,函數(shù)體內(nèi)的捕獲

async/await 中的try/catch

es6中的async是異步編程的終極解決方案,近期學(xué)習(xí)了一下,相對(duì)于 generator 來(lái)說(shuō),具有更好的特性:內(nèi)置執(zhí)行器、更好的語(yǔ)義、更好的適用性,需要注意一點(diǎn)的是 await 后面是promise 對(duì)象或者原始類型的值。
更有意思的是可以使用 try/catch 來(lái)捕獲異步中出現(xiàn)的異常

async/await中的 try/catch
// 定時(shí)器
function timer(params) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            // resolve("resolve");
            reject("reject");
        }, params);
    })
}

// async/await
async function fn(params) {
    try {
        var value = await timer(params);
    } catch (error) {
        console.log(error);        
    }
}

fn(1000); //執(zhí)行

promise的狀態(tài)變?yōu)?rejected 之后會(huì)跳轉(zhuǎn)到 catch

內(nèi)部實(shí)現(xiàn)

看了阮一峰老師的博客后,恍然大悟,原來(lái)是用 Generator.prototype.throw 和
Generator.prototype.next 來(lái)實(shí)現(xiàn)自動(dòng)執(zhí)行及異常拋出。

// 定時(shí)器
function timer(params) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            // resolve("resolve");
            reject("reject"); // next.value 為 rejected 狀態(tài)
        }, params);
    })
}

// aysnc 聲明的函數(shù)
function fn(args) {
    return spawn(function* () { // 配合 next 按步驟自動(dòng)執(zhí)行
        try {
            yield timer(args); // timer Promise類型
        } catch (error) {
            console.log(error);
        }
    });
}

// 自動(dòng)執(zhí)行器
function spawn(genF) {
    return new Promise(function (resolve, reject) {
        var gen = genF();

        function step(nextF) {
            try {
                var next = nextF(); // 執(zhí)行 gen.next 或者 gen.throw ,使用 try/catch 捕獲異常
            } catch (e) {
                return reject(e);
            }
            if (next.done) {
                return resolve(next.value);
            }
            Promise.resolve(next.value).then(function (v) {
                step(function () {
                    return gen.next(v);
                });
            }, function (e) {
                step(function () {
                    return gen.throw(e); // 若 next.value 是 rejected 狀態(tài),拋出異常,函數(shù)體內(nèi)的try/catch捕獲
                });
            });
        }
        step(function () {
            return gen.next(undefined);
        });
    });
}


fn(100).then(function (data) {
    console.log(data)
}).catch(function (error) {
    console.log(error);
})

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89482.html

相關(guān)文章

  • 如何優(yōu)雅地處理Async/Await的異常?

    摘要:能夠捕獲非異步的異常。來(lái)匹配正常異常的情況。在中處理所有的異常如果出錯(cuò),則退出。所以,的模式使得異常處理變得非常簡(jiǎn)潔。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,付費(fèi)客戶有陽(yáng)光保險(xiǎn)核桃編程荔枝掌門對(duì)微脈青團(tuán)社等眾多品牌企業(yè)。 譯者按: 使用.catch()來(lái)捕獲所有的異常 原文: Async Await Error Handling in JavaScript 譯者: Fundeb...

    villainhr 評(píng)論0 收藏0
  • 從不用 try-catch 實(shí)現(xiàn)的 async/await 語(yǔ)法說(shuō)錯(cuò)誤處理

    摘要:像這種中斷式的錯(cuò)誤處理,其實(shí)正適合采用。然而注意,上面的代碼中并沒(méi)有直接使用,而是使用了自定義的錯(cuò)誤消息。所以需要對(duì)出來(lái)的進(jìn)一步處理成指定的錯(cuò)誤消息。 前不久看到 Dima Grossman 寫的 How to write async await without try-catch blocks in Javascript??吹綐?biāo)題的時(shí)候,我感到非常好奇。我知道雖然在異步程序中可以不使...

    0xE7A38A 評(píng)論0 收藏0
  • ES6 系列之我們來(lái)聊聊 Async

    摘要:標(biāo)準(zhǔn)引入了函數(shù),使得異步操作變得更加方便。在異步處理上,函數(shù)就是函數(shù)的語(yǔ)法糖。在實(shí)際項(xiàng)目中,錯(cuò)誤處理邏輯可能會(huì)很復(fù)雜,這會(huì)導(dǎo)致冗余的代碼。的出現(xiàn)使得就可以捕獲同步和異步的錯(cuò)誤。如果有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤?,?qǐng)務(wù)必給予指正,十分感謝。 async ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便。 在異步處理上,async 函數(shù)就是 Generator 函數(shù)的語(yǔ)法糖。 ...

    Songlcy 評(píng)論0 收藏0
  • JS 異步錯(cuò)誤捕獲二三事

    摘要:以及異步代碼在中是特別常見(jiàn)的,我們?cè)撛趺醋霾疟容^無(wú)法捕獲的情況這段代碼中,的回調(diào)函數(shù)拋出一個(gè)錯(cuò)誤,并不會(huì)在中捕獲,會(huì)導(dǎo)致程序直接報(bào)錯(cuò)崩掉。用捕獲異步錯(cuò)誤把異步操作用包裝,通過(guò)內(nèi)部判斷,把錯(cuò)誤,在外面通過(guò)捕獲。 引入 我們都知道 try catch 無(wú)法捕獲 setTimeout 異步任務(wù)中的錯(cuò)誤,那其中的原因是什么。以及異步代碼在 js 中是特別常見(jiàn)的,我們?cè)撛趺醋霾疟容^? 無(wú)法捕獲的...

    Java_oldboy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<