Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待api调用完成,然后返回结果Nodejs_Javascript_Node.js_Express_Asynchronous - Fatal编程技术网

Javascript 等待api调用完成,然后返回结果Nodejs

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) =

我尝试在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) => {
        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循环