我试图在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>
谢谢!
答案 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();
}
}
)
}
这将确保在请求返回后,它将使用新网址调用另一个请求。