【问题标题】:AWS Lambda does not resolve all promises before terminating [duplicate]AWS Lambda 在终止前未解决所有承诺 [重复]
【发布时间】:2020-03-16 00:25:38
【问题描述】:

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

我的邮箱订阅了该主题,并且订阅已确认。

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

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

  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 在解决承诺之前终止,但我不知道为什么。我按照here的建议使用了Promise.all()

提前致谢

【问题讨论】:

标签: javascript amazon-web-services promise aws-lambda


【解决方案1】:

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

要修复它,您可以:

  1. 删除 async 关键字,因此 Lambda 将等待 calllback 调用,或者;
  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

【讨论】:

  • 谢谢。我实际上在我的函数中使用了异步代码,我忘记从函数处理程序中删除异步令牌。在您回复之前不久,我还在我的问题中添加了一个虚假的异步代码。也许你想更新你的答案。无论如何我接受它,因为你的观点是正确的
猜你喜欢
  • 2016-07-05
  • 1970-01-01
  • 2015-06-24
  • 2016-12-06
  • 1970-01-01
  • 2016-01-10
  • 2020-03-07
  • 2020-10-25
  • 2021-07-13
相关资源
最近更新 更多