【发布时间】: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