cre*_*124 7 javascript amazon-web-services node.js promise aws-lambda
我在使用一些node.js代码时遇到了一些问题,我将其放入AWS Lambda.我需要做几个异步调用,虽然第一个是我期望的行为,但lambda函数在第二个调用完成之前终止.
返回值为null,这让我认为lambda正在触及它的隐式回调,但是我认为它不应该这样做,而有一个尚未解决的承诺.
码:
exports.handle = async function(event, context) {
var AWS = require("aws-sdk");
AWS.config.update({
region: "eu-west-1",
endpoint: "dynamodb.eu-west-1.amazonaws.com"
});
var docClient = new AWS.DynamoDB.DocumentClient();
console.log("Scanning Catalogue...");
var params = {
TableName : "Catalogue"
};
await docClient.scan(params).promise().then(function (data) {
console.log("Scan succeeded.");
data.Items.forEach(function (item) {
//console.log(item.url);
checkIfUpdateRequired(item);
})
})
}
async function checkIfUpdateRequired (catalogueItem) {
var request = require("request-promise");
console.log("Getting " + catalogueItem.url);
await request(catalogueItem.url).then(function(response) {
console.log(response.statusCode);
console.log(response.headers['content-type']);
});
}
Run Code Online (Sandbox Code Playgroud)
日志输出:
START RequestId: 634a55b7-6258-11e8-9f18-6b300c3b5de1 Version: $LATEST
2018-05-28T09:20:44.425Z 634a55b7-6258-11e8-9f18-6b300c3b5de1 Scanning Catalogue...
2018-05-28T09:20:45.446Z 634a55b7-6258-11e8-9f18-6b300c3b5de1 Scan succeeded.
2018-05-28T09:20:47.967Z 634a55b7-6258-11e8-9f18-6b300c3b5de1 Getting https://raw.githubusercontent.com/BSData/wh40k/master/Aeldari%20-%20Craftworlds.cat
2018-05-28T09:20:48.028Z 634a55b7-6258-11e8-9f18-6b300c3b5de1 Getting https://raw.githubusercontent.com/BSData/wh40k/master/Imperium%20-%20Adeptus%20Custodes.cat
END RequestId: 634a55b7-6258-11e8-9f18-6b300c3b5de1
REPORT RequestId: 634a55b7-6258-11e8-9f18-6b300c3b5de1 Duration: 7882.68 ms Billed Duration: 7900 ms Memory Size: 128 MB Max Memory Used: 49 MB
Run Code Online (Sandbox Code Playgroud)
所以日志告诉我调用checkIfUpdateRequired(),但lambda在完成promise之前结束(报告成功,结果值为null).我没有对处理程序进行任何手动返回或回调,这似乎是与lambda结束'早期'相关的问题的标准.
我的智慧结束了,任何人都可以提出任何建议吗?
你不是在等待承诺checkIfUpdateRequired完成;而是在等待。docClient.scan原始代码中的所有内容都是同步的。用于Promise.all等待所有承诺完成:
await docClient.scan(params).promise().then(function (data) {
console.log("Scan succeeded.");
return Promise.all(data.Items.map(checkIfUpdateRequired));
});
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用的是await,那么如果您习惯使用它而不是.then. 例如,您可以重构为:
const data = await docClient.scan(params).promise();
return Promise.all(data.Items.map(checkIfUpdateRequired));
Run Code Online (Sandbox Code Playgroud)
和
async function checkIfUpdateRequired (catalogueItem) {
// actually, better to only require once, rather than on every function call
const request = require("request-promise");
console.log("Getting " + catalogueItem.url);
const response = await request(catalogueItem.url)
console.log(response.statusCode);
console.log(response.headers['content-type']);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1156 次 |
| 最近记录: |