AWS Lambda 无需等待承诺即可返回

אור*_*rid 5 javascript amazon-web-services es6-promise aws-lambda

我有一个在节点环境中运行良好的功能。该函数使用 promise,通过 S3 调用和 then 和 catch 来调用回调,其中包含相关的 200/500 statusCode 和消息正文。

现在我将它部署为一个 lambda 函数,它周围有一个包装器,如下所示:

module.exports.getAvailableDates = (event, context, callback) => {
  const lambdaParams = retrieveParametersFromEvent(event);
  console.log(`Got the criteria`);
  module.exports.getFilteredDates(lambdaParams.startDate,
                                 lambdaParams.endDate, callback);
  console.log(`Returning without the internal function results`);
};
Run Code Online (Sandbox Code Playgroud)

内部函数如下所示:

module.exports.function getFilteredDates(startDate, endDate) {
  const dateSet = new Set();
  return new Promise((resolve, reject) => {
    const getAllDates = (isDone) => {
      if (isDone) {
        const Dates = Array.from(dateSet).join();
        resolve(Dates);
        return;
      }
      getTestedDates(startDate, endDate, region, func, memory,
        lastDateKey, dateSet).then(getAllDates).catch((error) => {
          reject(error);
        });
    };
    lastDateKey = '';
    getTestedDates(startDate, endDate, region, func, memory,
      lastDateKey, dateSet).then(getAllDates).catch((error) => {
        reject(error);
      });
  });
}
Run Code Online (Sandbox Code Playgroud)

更内部的函数看起来很相似,只是它实际上查询 S3 数据库并从中返回与日期条件匹配的键列表。

在 AWS CloudWatch 日志中,我看到了两个打印件,仅在它们之后是内部函数输出。我的理解是 lambda 函数不会等待带有承诺的内部函数实际执行其工作(包括对承诺的内部等待),而是以错误状态返回给我。我能做什么?

Mar*_*coL 0

你的最后一个在执行console.log之前执行。callback

如果您想在退出 Lambda 之前打印完整的语句,则需要包装callback广告等待 Promise 完成:

import getFilteredDates from '../path/to/file';

module.exports.getAvailableDates = (event, context, callback) => {
  const lambdaParams = retrieveParametersFromEvent(event);
  console.log(`Got the criteria`);
  getFilteredDates(lambdaParams.startDate,lambdaParams.endDate)
  .then( result => {

    console.log(`Returning the internal function results`);
    return callback();
  })
  .catch(callback);
};
Run Code Online (Sandbox Code Playgroud)

我已经更新了代码以使用下面的函数的 Promise 。

你的getFilteredDates需要稍微重塑一下:

  • 要么你有第三个参数来接受内部回调并在内部处理 Promise 链
  • 或者您公开一个承诺并在主范围内外部处理回调。

让我们重构它,只返回一个 Promise 并在外部处理回调:

  function getFilteredDates(startDate, endDate) {
    const dateSet = new Set();
    return new Promise((resolve, reject) => {
      const getAllDates = (isDone) => {
        if (isDone) {
          const Dates = Array.from(dateSet).join();
          resolve(Dates);
          return;
        }
        getTestedDates(startDate, endDate, region, func, memory,
          lastDateKey, dateSet).then(getAllDates).catch((error) => {
          reject(error);
        });
    };
    lastDateKey = '';
    getTestedDates(startDate, endDate, region, func, memory,
      lastDateKey, dateSet).then(getAllDates).catch((error) => {
      reject(error);
    });
  });
}
module.exports = getFilteredDates;
Run Code Online (Sandbox Code Playgroud)