gpt4 book ai didi

javascript - AWS Lambda 在终止前不会解决所有 promise

转载 作者:行者123 更新时间:2023-12-02 22:29:39 24 4
gpt4 key购买 nike

我正在努力开发一个简单的 AWS Lambda 函数,该函数应该将一些消息发布到 SNS 主题。

我的电子邮件地址已订阅该主题,并且订阅已确认。

该主题与我的 lambda 函数位于同一区域。

该函数与附加了两个策略的 IAM Angular 色关联:

  1. 默认策略 AWSLambdaBasicExecutionRole
  2. 另一个允许该函数写入我的 SNS 主题的策略

政策:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sns:Publish",
"Resource": "arn:aws:sns:eu-west-1:XXXXXXXXXXXX:YYYYYYYYYYYYYYYYYYY"
}
]
}

这是我的函数代码,在Cloud9上开发。

const AWS = require("aws-sdk");
const sns = new AWS.SNS({region:'eu-west-1'});

exports.handler = async (event, context, callback) => {

const apiResponse = new Promise((resolve, reject) => {
setTimeout(() => resolve(['one', 'two', 'three']), 500)
});

const messages = await apiResponse;

const promises = [];

messages.forEach(txt => {
promises.push(sns.publish({
Message: txt,
Subject: txt,
TopicArn: 'arn:aws:sns:eu-west-1:xxxxxxxxxxxx:MyWebsiteContactForm'
}).promise());
});

console.log(promises);

Promise.all(promises,
function (values) {
console.log(values);
callback(null, values);
},
function(err) {
console.error(Error(err));
callback(Error(err));
}
);
};

执行此代码的结果正是预期的输出,但它从未在 Promise.all() 中记录任何内容.

[ Promise { <pending> },
Promise { <pending> },
Promise { <pending> } ]

这就像 Lambda 在解决 promise 之前终止一样,但我不明白为什么。我用过Promise.all()按照建议here

提前致谢

最佳答案

由于您在处理程序上使用 async 关键字,因此 lambda 将等待它并退出。您的 async 函数不包含任何 await,因此它将立即运行。

要修复它,您可以:

  1. 删除 async 关键字,以便 Lambda 将等待 callllback 调用,或者;
  2. Promise.all() 中使用await,如下所示:
const AWS = require("aws-sdk");
const sns = new AWS.SNS({region:'eu-west-1'});

exports.handler = async (event, context) => {

const promises = [];

['one', 'two', 'three'].forEach(txt => {
promises.push(sns.publish({
Message: txt,
Subject: txt,
TopicArn: 'arn:aws:sns:eu-west-1:XXXXXXXXXXXX:YYYYYYYYYYYYYYYYYYY'
}).promise());
});

console.log(promises);

try {
let values = await Promise.all(promises);
// do any transformations here
return values;
} catch (err) {
console.error(err);
// deal with errors here or re-throw the error if you need that
// the lambda function results in error too.
throw(err);
// Or
return "something went wrong";
}
};

有关更多详细信息,请参阅 https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

关于javascript - AWS Lambda 在终止前不会解决所有 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58951751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com