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

问题描述 投票:0回答:2

我的 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',
      }
    }
  }
};
node.js amazon-web-services http aws-lambda axios
2个回答
15
投票

文档

中所述

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

如果您不返回承诺,则无法保证您的异步任务将运行结束。通过创建处理程序

async
,您确实在返回一个承诺。但是,如果没有
await
ing
Promise.all
,处理程序的这个承诺将立即得到解决,因此 lambda 的执行(以及所有未完成的异步任务)将停止。

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

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


0
投票

如果您不关心所有这些请求的结果,但仍然希望确保所有请求都被执行,则不需要将 lambda 作为异步函数。

你是否尝试过做类似的事情:

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

我什至不认为你需要你的外部尝试捕获,因为无论如何地图迭代器上发生的任何错误,你只是吞下它,所以它永远不会传播。

© www.soinside.com 2019 - 2024. All rights reserved.