Подождите, пока вызовы API завершатся, а затем верните результат Nodejs - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь сделать вызов API несколько раз в For:

const myPromise = new Promise(function(resolve, reject) {
  // code here
  for (let i = 0; i < recommendedMovies.length; i++) {
    tmdb.genre.movies(
      recommendedMovies[i].id,
      randomNumber,
      (err, response) => {
        if (!err) {
          finalMovies.push(response.results);
          resolve(finalMovies)
        } else {
          reject('error')
        }
      }
    );
  }     
});

как видите, я помещаю каждый результат вызова в массив с именем finalMovies, и затем пытается вернуть результат следующим образом:

myPromise
  .then(function whenOk(response) {
    res.json(response)
  })
  .catch(function notOk(err) {
    console.log(err);
  });

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

Как я могу изменить свой код, чтобы я мог подождать, пока myPromise завершит цикл, а затем вернет массив?.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 10 марта 2019

Обещание разрешается только один раз, поэтому вам нужно разрешить другое обещание для каждого запроса, а затем использовать Promise.all для их объединения:

const promises = recommendedMovies.map(({ id }) => new Promise((resolve, reject) =>  {
  tmdb.genre.movies(id, randomNumber, (err, response) => {
    if (!err) {
      resolve(response.results);                 
    } else {
      reject('error')
    }
  });
}));

const result = Promise.all(promises);
result.then(/*...*/).catch(/*...*/);
0 голосов
/ 12 марта 2019

Ваш код пытается выполнить асинхронную операцию (вызов API) как синхронную, что невозможно в файле node.js.Здесь будет происходить повторение цикла while для цикла for, запросы к API выполняются с регистрацией обратного вызова, а затем цикл завершается и продолжается.Во время каждого запроса возврат с кодом ответа завершается.

Правильный способ сделать это, как упомянуто Джонасом в ответе выше.

Другой альтернативой является использование асинхронной библиотеки , которая написана специально для таких операций.В асинхронной библиотеке есть циклические функции, такие как each (), eachLimit () для использования вместо цикла for в такой ситуации.

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