函数正在返回对象 Promise - nodejs

Posted

技术标签:

【中文标题】函数正在返回对象 Promise - nodejs【英文标题】:Function is returning object Promise - nodejs 【发布时间】:2019-02-16 10:56:33 【问题描述】:

我面临一个问题,即函数 getVideoDetailsobject 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;
          );
     

【问题讨论】:

它从网络异步加载一个值。不可能立即返回仅在将来可用的值。 我正在尝试修复您的代码,当我在您分配 result[i] = ... 的位置遇到奇怪的代码时,然后在下一行,您将其他内容分配给 result[i]。这对我来说毫无意义,所以我不明白你真正想用它做什么。 【参考方案1】:

只需添加一个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);
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    );

【讨论】:

以上是关于函数正在返回对象 Promise - nodejs的主要内容,如果未能解决你的问题,请参考以下文章

异步函数返回 Promise <Pending>

如何从对象的`get()`获取异步数据而不返回Promise

nodejs中function*yield和Promise的示例

nodejs promise深度解析

如何在不返回 Promise 的情况下从对象的`get()` 获取异步数据

Promise入门之:让函数返回一个Promise对象