AWS Lambda和承诺:未调用回调

jlr*_*lin 1 javascript node.js promise async-await aws-lambda

我假设我在承诺方面缺乏一些基本知识。我有一个在AWS Lambda内的流程,该流程下载三个文件,然后生成通过电子邮件发送的输出。

module.exports.test = async (event) => {
   var p = download1();
   var c = download2();
   var h = download3();

   await Promise.all([p, c, h]).then(() => {
     ... bunch of logic manipulating the data
     customers.forEach(i => {
       buildFile().then(data => {
         sendEmail(data).then(response => {
            console.log('Email sent successfully');
         });
       });
     });
   }, errHandler);
};
Run Code Online (Sandbox Code Playgroud)

buildFile和sendEmail函数都返回Promise,但是我从没收到“电子邮件已成功发送”消息。它运行代码,但实际上在Lambda完成之前从未返回(至少我认为这是正在发生的事情)。

我的理解是Promise将完成回调,但是现在我想我需要做的事情与在原始Promise.all()中进行下载的方式类似。那是正确的方向吗?

该过程应获取文件,然后遍历客户以创建每个文件并通过SES发送。

Ber*_*rgi 6

您正在寻找

module.exports.test = async (event) => {
  var p = download1();
  var c = download2();
  var h = download3();

  try {
    await Promise.all([p, c, h]);

    // ... bunch of logic manipulating the data
    var promises = customers.map(async (i) => {
      var data = await buildFile();
      var response = await sendEmail(data);
      console.log('Email sent successfully');
    });
    await Promise.all(promises);
  } catch(e) {
    errHandler(e);
  }
};
Run Code Online (Sandbox Code Playgroud)

您的test函数没有等待您在forEach循环中创建的promise ,因此lambda在完成所有操作之前就完成了。