Как дождаться окончания вызовов API и вернуть результат? - PullRequest
0 голосов
/ 10 марта 2019

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

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(/*...*/);

Как видите, я пытаюсь дождаться завершения вызовов API и затем вернуть результат, который должен быть массивом.

Как мне этого добиться?

const result = Promise.all(promises);
result.then(/*...*/).catch(/*...*/);

Сначала я получаю результат, а затем вызовы API завершаются, поэтому я получаю только массив ожидающих обещаний.

Спасибо!

1 Ответ

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

Promise.all(promises).then(results => { ... process each result });

Метод Promise.all принимает массив обещаний и создает новое обещание, которое успешно выполняется, если все обещания выполняются, и не выполняется, если даже одно обещание не выполняется.Успешный обратный вызов получает массив последующих значений (results массив выше), по одному для каждого переданного обещания, в том же порядке .

В вашем примере вы обработаетеэто так:

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( promisesResults => {
    /* promisesResults is an array where each element is result of promise at the same index */
    promisesResults.forEach( promiseResult => {
    /* .. process each promiseResult .. */
    };
}).catch(/*...*/);

Для справки есть также Promise.race, который принимает массив обещаний и возвращает совершенно новое обещание, которое разрешается или отклоняется, как только первое изобещания разрешаются или отклоняются.Успешный обратный вызов получает значение первого разрешенного обещания.

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