尽管使用 Node12.x 在 AWS Lambda 上尝试捕获,但未处理的承诺拒绝

spo*_*man 2 asynchronous node.js promise aws-lambda

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

promiseArray.push(lambda.invoke(params).promise())
Run Code Online (Sandbox Code Playgroud)

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

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

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

Alb*_*res 5

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

来自Promise 文档

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

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

要仅运行此块中的 Promise 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!");
    }
}
Run Code Online (Sandbox Code Playgroud)