gpt4 book ai didi

javascript - AWS Lambda 返回而不等待 promise

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:40:13 24 4
gpt4 key购买 nike

我有一个函数在节点环境中运行良好。该函数使用 promises,通过 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`);
};

内部函数如下所示:

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

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

在 AWS CloudWatch 日志中,我看到了两个输出,并且仅在它们之后是内部函数输出。我的理解是,lambda 函数并没有等待带有 promise 的内部函数实际完成它的工作(包括内部等待 promise )并以错误的状态返回给我。我能做什么?

最佳答案

您的最后一个 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);
};

我已经更新了代码,以便在给定以下函数的情况下使用 Promises。

您的 getFilteredDates 需要稍微调整一下:

  • 要么你有第三个参数来接受内部回调并在内部处理 Promise 链
  • 或者您公开一个 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;

关于javascript - AWS Lambda 返回而不等待 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45027577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com