אור*_*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 函数不会等待带有承诺的内部函数实际执行其工作(包括对承诺的内部等待),而是以错误状态返回给我。我能做什么?
你的最后一个在执行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 并在外部处理回调:
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)
| 归档时间: |
|
| 查看次数: |
2820 次 |
| 最近记录: |