[英]Node.Js API wait for dynamodb calls to finish to send to browser
对于用于数据库的dynamodb调用,我有很多代码。 基本上,我有几个相互链接的数据库调用,然后最重要的是我需要遍历多个项目。 然后最后,我需要能够将新的JSON对象发送到前端以正确显示。 问题在于,映射在数据库调用完成之前完成,因此“ newItems”变量未定义。 基本上,我需要映射来等待数据库完成,然后再进行下一次迭代。
代码段不是完整的调用,而是相关的区域。 这些也都包装在app.get()中。
const newItems = items.map(function(item, i) { dynamoDb.scan({ TableName: GIVEAWAY_ENTRIES_TABLE, FilterExpression: "giveawayId = :giveawayId", ExpressionAttributeValues: { ":giveawayId": item.id } }, (error, ge_result) => { dynamoDb.scan({ TableName: USERS_TABLE, FilterExpression: "sessionId = :sii", ExpressionAttributeValues: { ":sii": sessionId } }, (error, result) => { dynamoDb.scan({ TableName: GIVEAWAY_ENTRIES_TABLE, FilterExpression: "giveawayId = :giveawayId and userId = :userId", ExpressionAttributeValues: { ":giveawayId": item.id, ":userId": result.Items[0].id } }, (error, gemc_result) => { console.log("RESPONSEEEEEEE"); return { id: item.id, title: item.title, thumbnail: item.thumbnail, photo: item.photo, description: item.description, myCount: gemc_result.Count, totalCount: ge_result.Count } }); }); }) console.log("END OF MAPPPPP"); }); console.log("#######", newItems); res.json({'success': true, data: newItems});
我建议你第一件事就是使用原生功能promisify使AWS SDK函数返回一个promise
。 更具可读性! 然后,您可以利用node.js的承诺来处理异步代码,可以像这样使用它:
const util = require('util');
const safePromisify = function (fun, methodsArray) {
const suffix = 'Async';
methodsArray.forEach(method => {
fun[method + suffix] = util.promisify(fun[method]);
});
}
safePromisify(dynamoDb, ['scan']);
const newItems = items.map(function async(item, i) {
// ^^^^^ this is required to use await
// Note the async and await keywords
let ge_result = await dynamoDb.scanAsync({
TableName: GIVEAWAY_ENTRIES_TABLE,
FilterExpression: "giveawayId = :giveawayId",
ExpressionAttributeValues: {
":giveawayId": item.id
}
});
let result = await dynamoDb.scanAsync({
TableName: USERS_TABLE,
FilterExpression: "sessionId = :sii",
ExpressionAttributeValues: {
":sii": sessionId
}
});
let gemc_result = await dynamoDb.scanAsync({
TableName: GIVEAWAY_ENTRIES_TABLE,
FilterExpression: "giveawayId = :giveawayId and userId = :userId",
ExpressionAttributeValues: {
":giveawayId": item.id,
":userId": result.Items[0].id
}
});
return {
id: item.id,
title: item.title,
thumbnail: item.thumbnail,
photo: item.photo,
description: item.description,
myCount: gemc_result.Count,
totalCount: ge_result.Count
}
});
注意:您必须在函数调用后附加单词
Async
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.