【问题标题】:Unhandled Promise Rejection despite try catch on AWS Lambda with Node12.x尽管尝试使用 Node12.x 在 AWS Lambda 上捕获,但未处理的 Promise Rejection
【发布时间】:2020-06-21 07:39:28
【问题描述】:

我有一个从 AWS Lambda 内部调用其他 AWS Lambda 的承诺列表:

promiseArray.push(lambda.invoke(params).promise())

在另一个函数中,我遍历这些承诺并尝试解决它们:

for (let i = 0; i < promiseArray.length; i++) {
    try {
        let result = await promiseArray[i];
        console.log("Success!");
    } catch (e) {
        console.log("Failed!");
    }
}

这是我面临的问题。通常,调用会抛出一个 TimeoutError,它不会被 try-catch 块捕获,并通过抛出“未处理的 Promise Rejection”错误来终止 Lambda 执行。 请注意,这仅在我们在 Lambda 上从 Node 8.10 升级到 12.x 后才开始出现。

【问题讨论】:

  • 您尝试过使用Promise.all() 吗?
  • 为什么不使用 Promise.all 解决所有问题?
  • 我想分别解决每个承诺。如果一个承诺被拒绝,我仍然想处理其他承诺。
  • 你能提供解析这些承诺的异步函数吗?
  • 这个 lambda 的超时时间是多少?是默认3秒吗?

标签: node.js asynchronous promise aws-lambda


【解决方案1】:

问题在于承诺在创建后立即执行,而不是在等待时执行。

来自Promise documentation

executor 函数由 Promise 实现立即执行,传递 resolve 和 reject 函数(在 Promise 构造函数甚至返回创建的对象之前调用 executor)

考虑到您正在使用自定义的 1 秒超时,我想说其中一些承诺甚至在您到达循环等待它们之前就失败了,在那里您有一个 try-catch 块。

要仅在此 try-catch 块中运行 Promise,您可以稍微重构代码以不在之前创建 Promise,而仅在循环中创建。类似这样的东西:

for (let i = 0; i < params.length; i++) {
    try {
        let result = await lambda.invoke(params[i]).promise();
        console.log("Success!");
    } catch (e) {
        console.log("Failed!");
    }
}

【讨论】:

  • 谢谢。这似乎是这种情况,解释了错误的间歇性。但是上面的 sn -p 只和写同步调用一样有效。我需要弄清楚如何在避免原始错误的同时调用异步。
  • 是的,你是对的。您可以使用Promise.all 来并行化调用,但正如您在评论中提到的,如果单个承诺失败,您希望其他承诺继续。您可以从这里查看一些答案来实现 Promise.all ,而不会出现这种快速失败的行为:stackoverflow.com/questions/31424561/…
猜你喜欢
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2021-08-08
  • 2020-08-30
  • 1970-01-01
  • 2019-11-10
  • 2020-09-13
相关资源
最近更新 更多