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

Aza*_*aev 7 http amazon-web-services node.js aws-lambda axios

我的 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',
      }
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

der*_*her 14

正如文档中所述

如果您的代码执行异步任务,请返回一个承诺以确保它完成运行。当您解决或拒绝承诺时,Lambda 会将响应或错误发送给调用者。

如果您不返回承诺,则无法保证您的异步任务将运行结束。通过创建处理程序,async您确实返回了一个承诺。但是,如果没有await处理Promise.all程序的此承诺,则会立即解决,因此 lambda(以及所有未完成的异步任务)的执行将停止。

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

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

  • 那没关系。一旦事件处理程序返回(或者事件处理程序返回的承诺不再挂起),lambda 的执行(以及所有未完成的任务)就会停止。尽管等待 http 请求可能不需要大量计算,但它仍然需要调度资源(cpu 时间、io 带宽...) (3认同)