使用 async/await 捕获 Promise 中的错误

我试图用 async/await 捕获承诺中的错误,但以下代码会导致“未捕获的错误...”


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()


繁花如伊
浏览 125回答 2
2回答

扬帆大鱼

您是从 Promise 回调中抛出错误setTimeout,而不是从 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专门寻找要履行或拒绝的承诺。如果您拒绝承诺,而不是抛出与承诺的解决方案无关的错误(如您目前的情况),它将通过您当前的设置捕获。需要明确的是,您当前抛出的错误不会以任何方式插入到您正在运行的异步操作中。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错误处理。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript