当前位置: 首页 > 知识库问答 >
问题:

在try/catch块中等待两个promise将导致“未处理的promise拒绝”[重复]

穆宾白
2023-03-14
    null
async function testMultipleAwait() {
  try {
    const aPromise = new Promise((resolve) => {
      setTimeout(() => resolve('a'), 200);
    });

    const bPromise = new Promise((_, reject) => {
      setTimeout(() => reject('b'), 100);
    });

    const a = await aPromise;
    const b = await bPromise;
  } catch (e) {
    console.log('Caught error', e);
  }
}

testMultipleAwait();

不会导致“捕获错误”输出,相反,我得到

tsc test-try-catch-await.ts && node test-try-catch-await.js

(node:31755) UnhandledPromiseRejectionWarning: b
(node:31755) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:31755) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Caught error b
(node:31755) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1)

共有1个答案

郑俊材
2023-03-14

我想我知道问题出在哪里了。即使promise以并发方式启动,您仍然在依次等待apromisebpromise:

const a = await aPromise; // First await this...
const b = await bPromise; // and then start to await this

当两个promise都实现时,这就不是什么问题了。它会让jou等待promise的时间。所有都会等待,然后愉快地继续。这就是为什么这个问题一点都不那么明显...

重要的是要知道,由于异步/等待,这个try-catch在幕后被转换为promise。这意味着首先等待的the语句之后的任何内容都将在promise.then回调函数中结束。

tsc test-try-catch-await.ts && node test-try-catch-await.js

1 first node sees the error     > (node:31755) UnhandledPromiseRejectionWarning: b
2                                 (node:31755) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
3                                 (node:31755) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
4 and then your catch handler   >      Caught error b
5                                 (node:31755) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1)
PromiseRejectionHandledWarning: Promise rejection was handled asynchronously.

一旦微任务队列为空,就会抛出拒绝错误。

promise拒绝已经处理,但是node认为您太晚了。您可以使用promise.all来解决此问题。这样,您等待一次,您的异步函数将首先捕获每个潜在的错误。

// Everything just as it is.. and then:

const [a, b] = await Promise.all([
    aPromise, 
    bPromise,
]);

因为我很好奇,我在chrome控制台中输入了您的代码,看看会发生什么。错误日志会弹出一个非常短的时间(我猜是100ms)。看着这个输出,你可以听到chrome说:

 类似资料:
  • 本文介绍了单个promise组合器: 但我没有看到的是,一种运行所有promise的方法,但不是在个人promise被拒绝时短路。我如何确保所有的promise都得到履行,但我能处理拒绝和所有promise的解决?

  • 所以我迁移我的量角器测试使用异步/等待(链接)。 到目前为止,迁移是比较成功的,直到我一直遇到这个问题。下面是我的测试步骤,然后是代码,作为我正在处理的示例: 导航到特定页面 上述步骤的相关代码: 测验ts 我一直得到这个错误: (节点: 13672)UnhandledPromiseRejse警告:未处理的promise拒绝(拒绝id: 1): StaleElementRequiceError:

  • 我想在Repl上为我的游戏实现一个基本的排行榜。它,所以我创建了一个节点。js后端。这是我在后端的配置: 但是每当我尝试发布时,我都会得到以下错误: (节点:344)未处理的PromisejectionWarning:TypeError:无法读取null的属性“push” (节点:344)UnhandledPromiseRejtionWarning:未处理的promise拒绝。这个错误要么是由于抛

  • 错误: (节点:6772)UnhandledPromiseRejectionWarning:未处理得承诺拒绝.这个错误可能是由于抛出一个没有catch块的异步函数内部,或者是由于拒绝了一个未用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志(请参见https://nodejs.org/api/CLI.html#CLI_unhandled_rejections_mod

  • 我得到这个错误- (节点:18420)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“name” (节点:18420)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终止节点进程,请