【问题标题】:Asynchronous YouTube API Calls in JavascriptJavascript 中的异步 YouTube API 调用
【发布时间】:2015-09-14 13:40:04
【问题描述】:

我想使用 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 调用中的语法是什么样的。

如果有人能帮忙,那就太好了!

【问题讨论】:

  • 现在您必须更改该客户端 ID(保留编辑历史记录)。下次小心点。
  • @Xan 哎呀,很好。我在最初的帖子中将其空白,但我编辑了代码并忘记再次更改它。我会立即更改客户 ID。

标签: javascript ajax google-chrome-extension youtube-api


【解决方案1】:

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

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

【讨论】:

  • 在您发布此内容时,我正在输入我的问题的答案!是的,你是对的。我弄乱了参数。现在一切正常。谢谢!
猜你喜欢
  • 2021-07-20
  • 2016-03-07
  • 2015-09-01
  • 2012-01-02
  • 2010-10-25
  • 2016-09-02
  • 1970-01-01
  • 2012-10-04
  • 2019-07-14
相关资源
最近更新 更多