我试图多次调用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完成循环,然后返回数组?
谢谢!
答案 0 :(得分:5)
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(/*...*/);
答案 1 :(得分:0)
您的代码正在尝试以异步方式执行异步操作(调用API),而这在node.js中是无法实现的。在这里,将会发生的事情是,在for循环上迭代通过注册回调执行对API的请求,然后for循环完成执行并继续。在每次请求返回时都会退出,并返回响应代码。
如上述答案中乔纳斯所提到的,正确的方法。
另一种替代方法是使用专门为此类操作编写的async library。有了异步库,在这种情况下就可以使用循环函数,例如each(),eachLimit()代替for循环。