繁体   English   中英

Node.Js API等待dynamodb调用完成以发送到浏览器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM