首页 > 解决方案 > 函数正在返回对象 Promise - nodejs

问题描述

我面临一个问题,即函数作为对象getVideoDetails返回object Promise,而我需要一个可以返回到另一个函数的简单对象getTrendingVideos

有人可以帮忙吗?

export class YoutubeService {
    getTrendingVideos() {

        var params = {
          part: 'snippet',
          chart: 'mostPopular',
          regionCode: 'GB',
          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()
                    };

                    //**Below line Returning a promise object**
                    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;
          });
     }
}

标签: node.jsexpresspromise

解决方案


只需添加一个Promise.all()呼叫。无论如何,您的getTrendingVideos()函数已经返回了一个承诺。

getTrendingVideos() {
    const params = {…};
    return axios.get('/', {params}).then(function(res){
        const promises = res.data.items.map(item => {
            const video = {
                id: item.id,
                title: item.snippet.title,
                thumbnail: item.snippet.thumbnails.high.url,
                publishedAt: moment(item.snippet.publishedAt).fromNow()
            };
            // Below line is returning a promise object, **and that's ok**
            return YoutubeService.getVideoDetails(video);
        });
        return Promise.all(promises);
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    });
}

推荐阅读