代码之家  ›  专栏  ›  技术社区  ›  amku91

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

  •  0
  • amku91  · 技术社区  · 7 年前

    嗨,我在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;
        });
      }
    }
    

    问题是,首先,当我对趋势进行控制台操作时,它总是打印出来 <promise> ...

    当我在axios get方法中执行console.log时,它正在打印数据。意味着数据即将到来,但没有更新到我的异步函数。

    有什么需要帮忙的吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   dvsoukup    7 年前

    看起来您只是在向一个数组添加承诺,然后简单地返回该数组,这就是为什么您得到当前的console.log输出。 您不是首先解析循环中的每个承诺,而是简单地将句柄返回给每个未解析的承诺。你要么 await 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.
    });
    
    推荐文章