【问题标题】:Trouble with Youtube API, NodeJS, and PromisesYoutube API、NodeJS 和 Promises 的问题
【发布时间】:2016-02-27 14:46:41
【问题描述】:

我正在为我在 Node.js 中进行的项目的一部分而苦苦挣扎。几周前我第一次开始使用 Node,所以我对它非常陌生,而且我在一般编码方面不是很有经验。

我有一个名为 video.js 的库,我想在其中获取特定播放列表的视频列表。

我有一个原型函数,它在名为 getVideoList 的控制器中调用,它获取播放列表的 id 以及其他一些信息,然后对 youtube 进行 API 调用并获取结果。

如果结果多于 50 个,则在响应中会有一个 nextPageToken 属性。如果有,那么我将不得不再次进行 API 调用,以便获得下一页结果。 (我认为不可能在一次 API 调用中获取所有视频对象。)

一个例子:

code starts

first loop finishes

promise fulfilled

second loop starts

second loop finishes


...

meanwhile the rest of the code is already moving along to the next function (that needs to have the second loops results added to the data videolist)     

到目前为止,这段代码完成了第一个 API 调用,并将 dataObj 推送到 videoList 中。承诺在循环的其余部分完成之前实现。如果我从 if 语句的第一部分中取出了 fulfill(videoList),那么这个承诺根本就没有实现。

我已经做了很多阅读,看起来 Bluebird 可能是正确的方法,但这是我的代码中唯一无法正常工作的部分,我不知道是否有必要与否,如果是,我对如何在这种情况下实现它感到困惑。

任何帮助将不胜感激!

Videos.prototype.getVideoList = function(playlistInfo) {

var playlistId = playlistInfo.playlistId;

var videoList = [];
getVideos = function(playlistId, apiKey, nextPageToken) {
    var playlistOptions = {
            url: "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId=" + playlistId +  apiKey,
            method: 'GET'
    };
    if (nextPageToken) {
        playlistOptions.url = playlistOptions.url + '&pageToken=' + nextPageToken
    }

    return new Promise(function(fulfill, reject){
        request(playlistOptions, function(error, results, body){
            if (error) { reject(error); };

            var result = JSON.parse(body);
            for(var i = 0; i < result.items.length; i++){
                    var dataObj = {};
                    dataObj.videoId = result.items[i].contentDetails.videoId;
                    dataObj.title = result.items[i].snippet.title;
                    if (result.items[i].snippet.thumbnails) {
                        dataObj.thumbnail = result.items[i].snippet.thumbnails.default.url;
                    };
                    videoList.push(dataObj);
            };
            if (result.nextPageToken){
                getVideos(playlistId, apiKey, result.nextPageToken);
                fulfill(videoList);
            } else {
                fulfill(videoList);
            }
        })

    });

}
return getVideos(this.videoTotal, playlistId, this.apiKey);
}         

【问题讨论】:

    标签: javascript node.js youtube promise bluebird


    【解决方案1】:

    使用符合 Promise A+ 的库(例如 Bluebird),您可以用另一个 Promise 解决任何 Promise。在您的情况下,解决方案可能很简单:

    if (result.nextPageToken){
        fulfill(getVideos(playlistId, apiKey, result.nextPageToken));
    } else {
        fulfill(videoList);
    }
    

    分辨率不是立即在第一页上解析 videoList,而是变成下一页的结果(当它们可用时),这将由之后页面的结果解决......等等,直到你点击没有 PageToken 的页面,整​​个链被解析为完整的 videoList。

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2016-11-09
      • 2011-04-06
      • 1970-01-01
      相关资源
      最近更新 更多