簡體   English   中英

等待api調用完成,然后返回結果Nodejs

[英]Wait for api calls to finish and then return the result Nodejs

我試圖多次進行一次api調用,方法是:

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完成循環然后返回數組?

謝謝!

一個Promise僅解決一次,因此您需要為每個請求解決另一個Promise,然后使用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(/*...*/);

您的代碼正在嘗試以異步方式執行異步操作(調用API),而這在node.js中是無法實現的。 在這里,將會發生的事情是,在for循環上迭代通過注冊回調執行對API的請求,然后for循環完成執行並繼續。 在每次請求時返回帶有響應代碼的退出。

正確的方法如上述答案中的喬納斯(Jonas)所述。

另一種選擇是使用專門為此類操作編寫的異步庫 有了異步庫,在這種情況下可以使用循環函數,例如each(),eachLimit()代替for循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM