国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

async/await 中的 try/catch

褰辯話 / 400人閱讀

摘要:定時器為狀態聲明的函數配合按步驟自動執行類型自動執行器執行或者,使用捕獲異常若是狀態,拋出異常,函數體內的捕獲

async/await 中的try/catch

es6中的async是異步編程的終極解決方案,近期學習了一下,相對于 generator 來說,具有更好的特性:內置執行器、更好的語義、更好的適用性,需要注意一點的是 await 后面是promise 對象或者原始類型的值。
更有意思的是可以使用 try/catch 來捕獲異步中出現的異常

async/await中的 try/catch
// 定時器
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); //執行

promise的狀態變為 rejected 之后會跳轉到 catch

內部實現

看了阮一峰老師的博客后,恍然大悟,原來是用 Generator.prototype.throw 和
Generator.prototype.next 來實現自動執行及異常拋出。

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

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

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

        function step(nextF) {
            try {
                var next = nextF(); // 執行 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 狀態,拋出異常,函數體內的try/catch捕獲
                });
            });
        }
        step(function () {
            return gen.next(undefined);
        });
    });
}


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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89482.html

相關文章

  • 如何優雅地處理Async/Await的異常?

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

    villainhr 評論0 收藏0
  • 從不用 try-catch 實現的 async/await 語法說錯誤處理

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

    0xE7A38A 評論0 收藏0
  • ES6 系列之我們來聊聊 Async

    摘要:標準引入了函數,使得異步操作變得更加方便。在異步處理上,函數就是函數的語法糖。在實際項目中,錯誤處理邏輯可能會很復雜,這會導致冗余的代碼。的出現使得就可以捕獲同步和異步的錯誤。如果有錯誤或者不嚴謹的地方,請務必給予指正,十分感謝。 async ES2017 標準引入了 async 函數,使得異步操作變得更加方便。 在異步處理上,async 函數就是 Generator 函數的語法糖。 ...

    Songlcy 評論0 收藏0
  • JS 異步錯誤捕獲二三事

    摘要:以及異步代碼在中是特別常見的,我們該怎么做才比較無法捕獲的情況這段代碼中,的回調函數拋出一個錯誤,并不會在中捕獲,會導致程序直接報錯崩掉。用捕獲異步錯誤把異步操作用包裝,通過內部判斷,把錯誤,在外面通過捕獲。 引入 我們都知道 try catch 無法捕獲 setTimeout 異步任務中的錯誤,那其中的原因是什么。以及異步代碼在 js 中是特別常見的,我們該怎么做才比較? 無法捕獲的...

    Java_oldboy 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<