Youtube API,NodeJS和Promise问题

我在Node中正在进行的项目的一部分工作非常挣扎。 几个星期前我第一次开始使用Node,所以我对它很陌生,在编码方面我也不是很有经验。

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

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

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

发生什么事的例子:

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。 这个承诺在循环的其余部分完成之前就已经完成了。 如果我将履行(videoList)从if语句的第一部分中删除,那么这个承诺根本就没有实现。

我一直在做很多的阅读,看起来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); } 

有了Promise A +兼容的库(比如Bluebird),你可以用另一个承诺解决任何承诺。 在你的情况下,解决scheme可能是这样简单的:

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

而不是立即在第一页parsingvideoList,parsing成为下一页(当它们变得可用时)的结果,这将通过在那之后的页面的结果等parsing,直到你点击一个页面没有PageToken,整个链被parsing为完整的videoList。