Javascript 中的异步 YouTube API 调用

Asynchronous YouTube API Calls in Javascript

我想使用 YouTube API 获取我所有的 YouTube 订阅。但是,Google 将 API 调用中返回的项目数量限制为 50。如果我订阅了 100 多个频道,我将不得不循环调用 API得到所有这些。现在我只想在 "Inspect popup" 调试控制台中 console.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 调用,但我只是想让它正常工作,然后我会将其移至后台脚本。

这段代码在第一次执行时效果很好;成功函数执行并记录频道 ID。所以我知道这不是身份验证的问题。但是,当在 success 回调中再次调用 GetInfo() 函数时, data 参数保持不变。所以我的脚本只是无限期地在第一个回调中记录数据。

我想说这是 Javascript 中闭包的问题,​​但我不知道 ajax 调用中的语法是什么样的。

如果有人能提供帮助,那就太好了!

根据 the documentation,API 的 参数 名称是 pageToken,而不是 nextPageToken。您的 nextPageToken 参数可能被 API 忽略,因此您一遍又一遍地获得第一页。所以你应该:

        data: {
            part: "snippet",
            mine: "true",
            pageToken: pageToken,
            access_token: userToken
        },