无法解析Node.js应用程序中的承诺并更新数据

无法解析Node.js应用程序中的承诺并更新数据,node.js,express,axios,Node.js,Express,Axios,嗨,我在Node.js中定义了一个路由器,它基于express,使用异步调用: const service = new YoutubeService(); router.get('/', async function(req, res) { const trends = await service.getTrendingVideos(); console.log(trends); res.render('youtube/index', { title: config.titl

嗨,我在Node.js中定义了一个路由器,它基于express,使用异步调用:

const service = new YoutubeService();
router.get('/', async function(req, res) {
  const trends = await service.getTrendingVideos();
  console.log(trends);
  res.render('youtube/index', {
    title: config.title,
    videos: trends
  });
});
我的服务文件如下所示:

export class YoutubeService {
  getTrendingVideos() {
    var params = {
      part: 'snippet',
      chart: 'mostPopular',
      regionCode: 'US', // should be replaced with country code from countryList
      maxResults: '24',
      key: config.youtubeApi.key
    };

    var result = [];

    return axios.get('/', {params}).then(function(res){
      result = res.data.items;
      for (var i = 0; i < result.length; i++) {
        result[i] = {
          id: result[i].id,
          title: result[i].snippet.title,
          thumbnail: result[i].snippet.thumbnails.high.url,
          publishedAt: moment(result[i].snippet.publishedAt).fromNow()
        };
        result[i] = YoutubeService.getVideoDetails(result[i]);
      }
      return result;
    });
  }

  static getVideoDetails(video) {
    var params = {
      part: 'statistics',
      id: video.id,
      key: config.youtubeApi.key
    };

    return axios.get('/', {params}).then(function(res) {
      var result = res.data;

      video.viewCount = result['items'][0].statistics.viewCount;
      video.likeCount = result['items'][0].statistics.likeCount;
      return video;
    });
  }
}
问题是,首先,当我做趋势控制台时,它总是打印。。。就像这样,它不更新数据,也只是在html中显示空白记录

当我在axios get方法中执行console.log时,它正在打印数据。表示数据正在进入,但未更新到我的异步函数


任何帮助都将不胜感激。

看起来您只是在向数组添加承诺,然后简单地返回该数组,这就是为什么您会获得当前的console.log输出。 您不是首先解析循环中的每个承诺,而是简单地将句柄返回给每个未解析的承诺。您需要在循环的每一次迭代中等待错误实践…,或者使用Promise.all解决您的承诺数组

尝试用承诺解决所有结果。全部

return axios.get('/', {params}).then(function(res){
  result = res.data.items;
  for (var i = 0; i < result.length; i++) {
    result[i] = {
      id: result[i].id,
      title: result[i].snippet.title,
      thumbnail: result[i].snippet.thumbnails.high.url,
      publishedAt: moment(result[i].snippet.publishedAt).fromNow()
    };
    result[i] = YoutubeService.getVideoDetails(result[i]);
  }
  return Promise.all(result); // <--- wrap this in a Promise.all.  It will resolve all promises in your array, concurrently.
});