[英]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.