AWS SQS Node.js脚本不等待

时间:2019-04-30 13:45:57

标签: node.js async-await aws-lambda amazon-sqs

尝试发送多个消息(如果重要的话,从AWS SQS lambda发送消息),但它从未等待承诺。

function getEndpoint(settings){
    return new Promise(function(resolve, reject) { 
    // [...] more stuff here
}

然后在循环中调用哪个:

exports.handler = async (event) => {
    var messages = [];
    event.Records.forEach(function(messageId, body) {
        //options object created from some stuff
        messages.push(getEndpoint(options).then(function(response){
            console.log("anything at all"); //NEVER LOGGED
        }));
    });
    await Promise.all(messages);
};

但是等待似乎完全被跳过了。我不确定如何通过显式Process exited before completing request获得await。在其他起作用的脚本中,我也有类似的异步等待/承诺设置,但无法发现我对此做错了什么。

1 个答案:

答案 0 :(得分:3)

您忘了将一些东西退还给lambda:

exports.handler = async (event) => {
    var messages = [];
    event.Records.forEach(function(messageId, body) {
        //options object created from some stuff
        messages.push(getEndpoint(options));
    });
    await Promise.all(messages);
    return 'OK'
};

这也应该起作用:

exports.handler = (event) => { // async is not mandatory here
    var messages = [];
    event.Records.forEach(function(messageId, body) {
        //options object created from some stuff
        messages.push(getEndpoint(options));
    });
    return Promise.all(messages); // returning a promise
};

您可以使用地图:

exports.handler = (event) => { // async is not mandatory here
    const messages = event.Records.map(function(messageId, body) {
        //options object created from some stuff
        return getEndpoint(options)
    });
    return Promise.all(messages); // returning a promise
};

要了解为什么会发生这种情况,您必须深入研究lambda的实现:它实际上将等待函数栈被清除,并且由于您根本未返回任何内容,因此函数栈在排队后就立即为空。所有内容-在await调用之后添加简单的返回值会使fn堆栈不为空,这意味着lambda将等待其完成。

如果您在标准节点上运行此函数,则函数也会在诺言完成之前返回,但在清除堆栈之前,节点进程不会退出。这是lambda与库存节点分离的地方。