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

时间:2015-03-12 01:28:00

标签: javascript api for-loop twitch

我试图在for循环中调用Twitch API,其中被调用的URL随着循环的每次迭代而改变,并且被调用的URL实际上是在前一次调用中返回的URL。

为什么呢? - Twitch API响应将您限制为100个返回的流,但包括一个“下一个”链接,用于设置偏移量,以便您可以获得下一个100,然后是下一个,依此类推。

我正在使用流星并写下这个:

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),并且不同地使用“下一个”URL,但与此相比,该代码非常混乱 - 假设我可以使其工作。< / p>

谢谢!

1 个答案:

答案 0 :(得分:1)

这里的问题是你的请求同时被触发(使用相同的参数!),并且只有在返回时才更改变量,这在第一个返回之后就好了。这是因为您调用的Meteor函数是异步的,并且不会等待。您可以将其更改为同步,但我强烈建议不要这样做,因为它很容易实现异步。

看起来像

  

A-&gt; http req

     

B-&gt; http req

     

C-&gt; http req

     

(等待)

     

A&lt; -http return,设置var

     

C&lt; -http return,设置var

     

C&lt; -http return,设置var

您希望将它们链接在一起,方法是在您的第一个请求后返回请求,例如

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();
            }

        }
    )
}

这将确保在请求返回后,它将使用新网址调用另一个请求。