AWS Lambda不会在没有等待的情况下执行承诺



我的AWS Lambda函数有以下处理程序。我不想也不需要等待Promise.all解决或拒绝。因为,我对它的结果不感兴趣。我的目的是发送这些请求并完成。问题是,如果我删除await关键字(用箭头指示(,请求就不会启动。但是,如果我输入await关键字,Lambda函数需要运行并充电3-5秒,这对我来说是不划算的。

你能解释一下我做错了什么吗?为什么在没有await关键字的情况下不发送请求?

module.exports.handler = async (event) => {
try {
const urls = [/*some API urls*/];
--> await Promise.all(urls.map((url) => {
return axios.post(url, { email })
.catch((error) => {
console.log(error);
});
}));
return {
statusCode: 200,
body: JSON.stringify({ message: 'OK' }),
headers: {
'Content-Type': 'application/json',
},
};
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify({ message: 'INTERNAL_ERROR' }),
headers: {
'Content-Type': 'application/json',
}
}
}
};

如文件中所述

如果您的代码执行异步任务,则返回一个promise以确保它完成运行。当您解析或拒绝promise时,Lambda会向调用程序发送响应或错误。

如果您不返回promise,就不能保证异步任务会运行到最后。通过使处理程序async,您实际上是在返回一个承诺。但是,如果没有await调用Promise.all,处理程序中的这个承诺将立即得到解析,因此lambda(以及所有未完成的异步任务(的执行将停止。

这似乎很合乎逻辑。否则,每个人都会在长时间运行的异步任务中编写繁重的计算。lambda函数中唯一的同步调用将调用该异步任务,lambda函数将在几毫秒后返回(并收取费用(。

如果你只想支付100毫秒的费用,那就让你的任务足够快。如果你的任务需要4秒,你必须支付4秒的费用。

最新更新