DynamoDB DocumentClient не ожидает внутри цикла - узел js 8.10 - PullRequest
0 голосов
/ 05 марта 2019

У меня проблемы с DynamoDB, который не дает мне результат запроса в цикле for. Запрос выполняется, но выполняется только после завершения цикла:

readMatchData(JSON) {
return new Promise((resolve, reject) => {



    for (var jsonInfo of JSON.Feed.MatchData) {


        var matchID = jsonInfo['@attributes'].matchID;

        console.log("matchID: " + matchID);

        var homeTeamID = team['@attributes'].homeTeamID;


        var params = {
            TableName: "Teams",
            KeyConditionExpression: "#teamID = :teamID",
            ExpressionAttributeNames: {
                "#teamID": "teamID"
            },
            ExpressionAttributeValues: {
                ":teamID": homeTeamID
            },
            ReturnConsumedCapacity: "TOTAL"
        }

        docClient.query(params, function(err, data) {

            if (err) {
                //console.log("We have an error when looking for the team in the Teams table");
                console.log(err);

            } else {

                if (data.Count === 0) {

                    //We did not find this ID in the db so we can add it.

                    console.log("The team doesn't exist");

                } else {

                    data.Items.forEach(function(item) {

                        console.log("Team " + item.teamID + " " + item.teamName + " found in the database");

                    })

                }

            }

        });


    }




    resolve("done");

});
}

В консоли это возвращает меня:

matchID: 3434

matchID: 3543

Team 3388 Hill U23 Команда найдена в базе данных

Team 44108 Мост U23 найден в базе данных

Вместо:

matchID: 3434

Team 3388 Hill U23 Команда найдена в базе данных

matchID: 3543

Team 44108 Мост U23 найден в базе данных

1 Ответ

1 голос
/ 05 марта 2019

Проблема заключается в том, что вызов docClient использует обратный вызов, как показано в этой строке:

docClient.query(params, function(err, data) { ... })

Это означает, что передаваемая вами функция не вызывается до завершения операции, что можетчерез некоторое время.

Вы можете сказать библиотеке обернуть ее в обещание, а затем ждать:

const data = await docClient.query(params).promise()

if (data.Count === 0) {
  //We did not find this ID in the db so we can add it.
  console.log('The team doesn\'t exist')
} else {
  data.Items.forEach(function (item) {
    console.log('Team ' + item.teamID + ' ' + item.teamName + ' found in the database')
  })
}

Редактировать: В настоящее время вы упаковываете всю свою функцию в обещание,но поскольку мы изолируем это просто обратным вызовом, вы, вероятно, захотите заменить его на что-то похожее на:

async function readMatchData () {
  for (var jsonInfo of JSON.Feed.MatchData) {

    var matchID = jsonInfo['@attributes'].matchID

    console.log('matchID: ' + matchID)

    var homeTeamID = team['@attributes'].homeTeamID

    var params = {
      TableName: 'Teams',
      KeyConditionExpression: '#teamID = :teamID',
      ExpressionAttributeNames: {
        '#teamID': 'teamID'
      },
      ExpressionAttributeValues: {
        ':teamID': homeTeamID
      },
      ReturnConsumedCapacity: 'TOTAL'
    }

    const data = await docClient.query(params).promise()

    if (data.Count === 0) {
      //We did not find this ID in the db so we can add it.
      console.log('The team doesn\'t exist')
    } else {
      data.Items.forEach(function (item) {
        console.log('Team ' + item.teamID + ' ' + item.teamName + ' found in the database')
      })
    }
  }
  return 'done'
}

РЕДАКТИРОВАТЬ: Кредит HMilbradt за указание на библиотеку имеет встроенную функцию обещания

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...