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

时间:2019-03-10 09:23:06

标签: javascript node.js express asynchronous

我试图多次调用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完成循环,然后返回数组?

谢谢!

2 个答案:

答案 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循环。

相关问题