Javascript AWS Lambda在终止之前不会解决所有承诺

Javascript AWS Lambda在终止之前不会解决所有承诺,javascript,amazon-web-services,promise,aws-lambda,Javascript,Amazon Web Services,Promise,Aws Lambda,我正在努力使用一个简单的AWS Lambda函数,它应该将一些消息发布到SNS主题 我的电子邮件地址已订阅该主题,并且已确认订阅 该主题与lambda函数位于同一区域 该功能与附加了两个策略的IAM角色关联: 默认策略AWSLambdaBasicExecutionRole 另一个允许函数写入我的SNS主题的策略 政策: { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEdi

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

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

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

该功能与附加了两个策略的IAM角色关联:

默认策略AWSLambdaBasicExecutionRole 另一个允许函数写入我的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中记录任何内容

这就好像兰姆达在解决承诺之前就终止了,但我不知道为什么。我用了承诺,一切都照我说的

提前感谢

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

要解决此问题,您可以:

删除async关键字,以便Lambda将等待callback调用,或者; 使用wait to your Promise.all,如下所示:
有关详细信息,请参见

谢谢。我实际上在函数中使用了异步代码,但我忘了从函数处理程序中删除异步令牌。在您回复之前不久,我还在我的问题中添加了一个假的异步代码。也许你想更新你的答案。无论如何,我接受它,因为你的观点是正确的投票结束,因为这是一个关于StackOverflow的99999个问题的重复。例如:,
[ Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> } ]
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";
    }
};