我想使用YouTube API获得我所有的YouTube订阅。然而,谷歌将API调用中返回的项目数量限制为50。如果我订阅了100多个频道,我将不得不循环API调用来获取所有这些频道。现在我只想在"Inspect popup"调试控制台中控制台.log()。
我读了很多关于如何在Javascript中的循环中进行异步调用的文章,但所有这些都使用了基本的for()
循环。在使用YouTube数据API的情况下,您必须进行API调用,然后使用nextPageToken
属性来获取下一个页面。
这是我当前的popup.js
文件:
$(document).ready(function() {
var ClientID = '[my client id]';
$('#testBtn').click(function() {
chrome.identity.getAuthToken({"interactive": true}, function(token) {
GetInfo(token, "");
});
});
function GetInfo(userToken, pageToken) {
$.ajax({
url: "https://www.googleapis.com/youtube/v3/subscriptions",
type: 'GET',
data: {
part: "snippet",
mine: "true",
nextPageToken: pageToken,
access_token: userToken
},
success: function(data) {
var allIds = "";
$.each(data.items, function(i, item) {
console.log(item.snippet.resourceId.channelId);
});
var nextPageToken = data.nextPageToken;
if (typeof nextPageToken !== 'undefined')
{
GetInfo(userToken, nextPageToken);
}
},
error: function(xhr, status, error) {
console.log(xhr.responseText);
}
});
}
});
我意识到,通常情况下,你不应该在popup.js中进行API调用,但我只想让它工作起来,然后我会把它移到后台脚本中。
这个代码第一次执行时效果很好;执行success函数并记录通道id。所以我知道这不是身份验证的问题。但是,当在success
回调中再次调用GetInfo()
函数时,data
参数保持不变。因此,我的脚本只是无限期地一次又一次地记录第一次回调中的数据。
我想说这是Javascript中闭包的一个问题,但我不知道ajax调用中的语法会是什么样子。
如果有人能帮忙,那就太好了!
根据文档,API的参数名称为pageToken
,而不是nextPageToken
。您的nextPageToken
参数可能会被API忽略,因此您会一次又一次地获得第一个页面。所以你应该有:
data: {
part: "snippet",
mine: "true",
pageToken: pageToken,
access_token: userToken
},