为什么要等待拒绝错误的正确处理

时间:2019-06-11 12:29:41

标签: javascript promise async-await

为什么promise catch无法与wait一起工作?

我要在拒绝时捕获错误,但结果有两个差异

(async () => {
    var t = (new Promise((r1, r2) => r2(12345))); 
    t.catch(e=> console.log(e)); 
    await t; 
})()

结果错误:VM5989:1 Uncaught (in promise)

(async () => {
    var t = (new Promise((r1, r2) => r2(12345))).catch(e=> console.log(e));
    await t; 
})()

没有错误并返回12345

演示图片:

node@12 / chrome@75 console处,我得到了两个差异结果。

当我使用t.catch时,我得到了Unhandled promise rejection

使用(new Promise()).catch时,我得到的结果除外。

为什么?以及如何使用t并获得正确的结果?

3 个答案:

答案 0 :(得分:2)

在第一个示例中,您通过调用t.catch()创建了一个处理该异常的新诺言,但没有将其分配给t,因此t仍然是一个诺言,带有一个未处理的拒绝。

在第二个示例中,t引用的链是一个带有已处理拒绝的承诺(.catch()连续不会抛出,因此它以undefined解析),所以等待{{ 1}}不会引发t函数。

但是,由于第一个示例中的async仍然包含被拒绝的承诺,因此等待它将会导致t函数抛出。

答案 1 :(得分:-1)

在第一个代码中,您将捕获钩和promise链接的位置仅在链接之后开始。

//Single promise that starts after the chain
(async () => {
    const t = (new Promise((r1, r2) => r2(12345))).catch(e=> console.log(e));
    await t; 
})()

在第二段代码中,您正在等待没有catch块的promise对象。

(async () => {
    const t = (new Promise((r1, r2) => r2(12345))); // "A" promise
    t.catch(e=> console.log(e));  // "A" promise + catch = "B" promise
    await t; // You are awaiting for the "A" promise
})()

答案 2 :(得分:-2)

在第一种情况下,由于Promise本质上是异步的,并且甚至在附加catch之前,语句r2已经执行。

这意味着在调用r2(拒绝函数)时不存在catch。

每当您在使用promise时拒绝时,必须存在catch。否则,很明显会看到拒绝错误。

编辑: @Patrick Roberts回答,

该错误不是由于未处理的捕获,而是由于rejected t的异常。在第二个语句中,t(承诺)仍然是pending