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.
调用另一个请求
我正在尝试在 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.
调用另一个请求