尝试发送多个消息(如果重要的话,从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
。在其他起作用的脚本中,我也有类似的异步等待/承诺设置,但无法发现我对此做错了什么。
答案 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与库存节点分离的地方。