gpt4 book ai didi

javascript - Youtube API、NodeJS 和 Promises 的问题

转载 作者:行者123 更新时间:2023-11-30 00:18:52 25 4
gpt4 key购买 nike

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

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

我有一个在名为 getVideoList 的 Controller 中调用的原型(prototype)函数,它获取播放列表的 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 中。 promise 在循环的其余部分完成之前完成。如果我从 if 语句的第一部分中取出 fulfill(videoList),那么 promise 根本就没有实现。

我已经做了很多阅读,看起来 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),您可以用另一个 promise 解决任何 promise。在您的情况下,解决方案可能很简单:

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

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

关于javascript - Youtube API、NodeJS 和 Promises 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33905881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com