簡體   English   中英

使用 async/await 在 promise 中捕獲錯誤

[英]Catching Error in promise with async/await

我正在嘗試使用 async/await 捕獲 promise 內的錯誤,但以下代碼導致“未捕獲的錯誤...”

function messup() {
    var promise = new Promise(function(resolve, reject){
        setTimeout(function() {
            throw new Error("Thrown from messup()");
            resolve('hello from messup function');
        }, 1000);
    });
    return promise;
}


async function waitForMe() {
    try {
        await messup();
    }catch(e) {
        console.log ('*****Error successfully caught! *****');
    }
}

waitForMe()

您從setTimeout拋出錯誤,而不是從 promise 回調中拋出錯誤。 與任何其他計時器回調一樣,沒有任何東西可以處理該錯誤,它會將 go 直接發送到瀏覽器的主機代碼,這可能會將其轉儲到控制台。

如果您想拒絕您退回的 promise,請使用reject

function messup() {
    var promise = new Promise(function(resolve, reject){
        setTimeout(function() {
            reject(new Error("Thrown from messup()"));
            resolve('hello from messup function'); // This line is pointless now
        }, 1000);
    });
    return promise;
}

如果您想在計時器回調中捕獲任何同步錯誤並將其傳遞給reject ,您可以使用try / catch

function messup() {
    var promise = new Promise(function(resolve, reject){
        setTimeout(function() {
            try {
                throw new Error("Thrown from messup()");
                resolve('hello from messup function'); // This line will never be reached
            } catch (e) {
                reject(e);
            }
        }, 1000);
    });
    return promise;
}

Try-catch 與await一起使用時專門尋找 promise 被履行或拒絕

如果你拒絕 promise,而不是拋出一個與承諾的解決方案無關的錯誤(就像你現在一樣),它將通過你當前的設置被捕獲。

需要明確的是,您當前拋出的錯誤不會以任何方式插入到您正在運行的異步操作中。

function messup() {
    var promise = new Promise(function(resolve, reject){
        setTimeout(function() {
            reject("Thrown from messup()"); //<-- do this instead
        }, 1000);
    });
    return promise;
}

進一步閱讀:我在本指南中更多地介紹了 async/await 錯誤處理 async/await

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM