簡體   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