javascript - AWS Lambda 和 promise : Callbacks not being called

标签 javascript node.js promise async-await aws-lambda

我假设我缺乏一些关于 promise 的基础知识。我在 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);
};

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

我的理解是 Promise 会完成回调,但现在我想我需要做一些类似于我在原始 Promise.all() 中进行下载的操作。这是正确的方向吗?

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

最佳答案

你在找

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);
  }
};

您的 test 函数没有等待您在 forEach 循环中创建的 promise ,因此 lambda 在一切完成之前完成。

关于javascript - AWS Lambda 和 promise : Callbacks not being called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56085000/

相关文章:

javascript - 使用 find() 在对象中循环数组

javascript - 是否有一个公式可以找到在一组中实现唯一性所需的最短长度

javascript - Angularjs $setValidity 来自指令未更新

node.js - 客户端无法连接到Azure应用程序服务上托管的nodejs websocket服务器?

angular - 不要从 Angular 表单发送值

javascript - 我无法处理拒绝的 promise

javascript - Getter 返回未定义

javascript - 如何判断用户何时登录 | express | Passport | Node

javascript - deferred.fail()后如何继续执行JS

node.js - 使用 sequelize 迁移时不会创建 Sequelize 特殊方法