Javascript 外部 API 在 for 循环中使用变量 URL 调用

Javascript external API calls with variable URL in for loop

我正在尝试在 for 循环中调用 Twitch API,其中被调用的 URL 随着循环的每次迭代而变化,而 URL 得到called 实际上是在上一次调用中返回的。

为什么? - Twitch API 响应将您限制为 100 个返回流,但包含一个 "next" link 设置偏移量,以便您可以获得下一个 100,然后是下一个等等。

我正在使用 meteor 并写了这个:

var extractGames = function(limit, pages) {
    var gamesURL = 'https://api.twitch.tv/kraken/streams';
    for (i=0; i < 3; i +=1) {
        Meteor.http.get(gamesURL, {
                params: {
                    limit: limit,
                    api_version: 3
                }
            }, function (err, res) {
                if (err) {
                    console.log(res.message);
                    console.log(res.error);
                } else {
                    gamesURL = res.data._links.next;
                    var data = res.data.streams;
                    console.log(gamesURL);
                    console.log(data[0].game);
                    console.log(data[75].game);
                    console.log("-----------");
                }

            }
        )
    }
};

我认为问题是新的 URL 不是每次都被调用,而是与原始连接保持打开状态并且没有改变。

响应如下所示:

? https://api.twitch.tv/kraken/streams?limit=100&offset=100
? H1Z1
? Pokémon Red/Blue
? -----------
? https://api.twitch.tv/kraken/streams?limit=100&offset=100
? H1Z1
? Pokémon Red/Blue
? -----------
? https://api.twitch.tv/kraken/streams?limit=100&offset=100
? H1Z1
? Pokémon Red/Blue
? -----------

如何让循环每次都调用新的 URL?

此外,我已经尝试获取总流并除以 100 (+1),并且不使用 "next" URL 以不同的方式进行处理,但与此相比该代码太乱了 - 假设我可以让它工作。

谢谢!

这里的问题是你的请求是同时触发的(使用相同的参数!),并且变量只在第一个 returns 时才改变,这在第一个 [=20] 之后=].这是因为您调用的 Meteor 函数是异步的,不会等待。您可以将其更改为同步,但我强烈建议不要这样做,因为将其设为异步很容易。

看起来有点像

A->http req

B->http req

C->http req

(wait)

A<-http return, sets var

C<-http return, sets var

C<-http return, sets var

您想将它们链接在一起,方法是在您的第一个请求之后调用下一个请求 returns,例如

function DoMeteorCall() {
    Meteor.http.get(gamesURL, {
            params: {
                limit: limit,
                api_version: 3
            }
        }, function (err, res) {
            if (err) {
                console.log(res.message);
                console.log(res.error);
            } else {
                gamesURL = res.data._links.next;
                var data = res.data.streams;
                console.log(gamesURL);
                console.log(data[0].game);
                console.log(data[75].game);
                console.log("-----------");

                // do call here
                DoMeteorCall();
            }

        }
    )
}

这将确保在请求 returns 之后,它将使用新的 url.

调用另一个请求