Javascript 等待api调用完成,然后返回结果Nodejs
我尝试在IDE a中多次调用api,用于:Javascript 等待api调用完成,然后返回结果Nodejs,javascript,node.js,express,asynchronous,Javascript,Node.js,Express,Asynchronous,我尝试在IDE a中多次调用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) =
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')
}
}
);
}
});
问题是我只得到第一次调用的数组
如何更改代码,以便等待myPromise完成循环,然后返回数组
谢谢 一个承诺只解析一次,因此您需要为每个请求解析另一个承诺,然后使用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(/*...*/);
承诺只解析一次,因此您需要为每个请求解析另一个承诺,然后使用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循环完成并继续执行。在每个请求返回时,响应代码退出 正确的方法是乔纳斯在上面的回答中提到的
另一种选择是使用专门为此类操作编写的。在这种情况下,使用异步库可以使用each、eachLimit等循环函数代替for循环。您的代码试图执行异步操作,以同步方式调用API,这在node.js中是无法实现的。这里将要发生的是,在for循环上迭代对API的请求,并注册回调,然后for循环完成并继续执行。在每个请求返回时,响应代码退出 正确的方法是乔纳斯在上面的回答中提到的 另一种选择是使用专门为此类操作编写的。对于异步库,在这种情况下可以使用each、eachLimit等循环函数代替for循环