【问题标题】:Why await not right working with reject error为什么等待不能正确处理拒绝错误
【发布时间】:2019-06-11 22:44:36
【问题描述】:

为什么 promise catch 不能与 await 一起使用?

我想在被拒绝时捕获错误,但我得到了两个不同的结果

(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 并获得正确的结果?

【问题讨论】:

  • 在第一个示例中,t 包含一个被拒绝的承诺,而你 await 为它。 awaiting 被拒绝的承诺会引发异常。在第二个示例中,t 包含一个已解决的承诺。 await一个已解决的承诺返回一个已解决的值。
  • 因为.catch 实际上并不是承诺链t 的一部分。您已经创建了第二个带有错误处理的链,然后被忽略。如果您使用t = t.catch(...),您会看到不同的行为。

标签: javascript promise async-await


【解决方案1】:

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

在第二个例子中,t 引用的链是一个带有处理拒绝的承诺(.catch() 延续不会抛出,所以它用undefined 解析),所以等待t 不会导致@ 987654328@ 要抛出的函数。

但是,因为第一个示例中的t 仍然包含一个被拒绝的promise,等待它会导致async 函数抛出。

【讨论】:

    【解决方案2】:

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

    这意味着当 r2 - 拒绝函数 - 被调用时,catch 不存在。

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

    编辑: 正如@Patrick Roberts 回答的那样,

    错误不是由于未处理的捕获,而是因为 rejected t 的等待。而在第二个语句的情况下,t(承诺)仍然是pending

    【讨论】:

    • var p = new Promise((r1, r2) => r2(12345)); p.catch(() => {}); 看,即使在下一个语句中添加了捕获,也没有未捕获的拒绝。
    • 对不起,我现在明白了,承诺被拒绝等待未处理的拒绝承诺,因此引发错误。更新我的答案,参考您的 (@PatrickRoberts) 答案。
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2021-03-26
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多