【问题标题】:Catching Error in promise with async/await使用 async/await 在 promise 中捕获错误
【发布时间】:2020-12-03 11:23:27
【问题描述】:

我正在尝试使用 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()

【问题讨论】:

  • 在 SO 上发誓不好

标签: javascript promise async-await


【解决方案1】:

您从setTimeout 抛出错误,而不是从承诺回调。与任何其他计时器回调一样,不会处理该错误,它会直接转到浏览器的主机代码,这可能会将其转储到控制台。

如果你想拒绝你返回的承诺,请使用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;
}

【讨论】:

    【解决方案2】:

    Try-catch 与 await 一起使用时专门寻找要履行或拒绝的承诺。

    如果您拒绝承诺,而不是抛出与承诺的解决方案无关的错误(就像您目前的情况),它将通过您当前的设置被捕获。

    需要明确的是,您当前抛出的错误绝不会插入到您正在运行的异步操作中。

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

    进一步阅读:我在guide to async/await 中详细介绍了 async/await 错误处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2020-09-07
      相关资源
      最近更新 更多