我有一个名字数组,我需要从中检索数据,而我现在正在循环中使用$ .getJSON。它工作,我可以检索数据,但输出正确的值,我需要使用setTimeout或类似。我想知道是否有更精致的方式来做我想要实现的目标。
这就是我所拥有的。
var names = ["riotgames", "example"];
var online = [];
for (var i = 0; i < names.length; i++) {
$.getJSON('https://api.twitch.tv/kraken/streams/' + names[i], function(data) {
if (data.stream != null) {
online.push(data.stream.channel.display_name);
};
});
}
console.log(online) // outputs []
setTimeout(function() {
console.log(online) // outputs correctly
}, 1000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
答案 0 :(得分:4)
执行$.getJSON
时,您正在触发异步请求。这意味着它们在后台运行。您没有等待让他们完成,他们的回调将在请求完成后触发(如事件)。
这意味着您无法从外部访问回复{/ 1>。
如果你想等待&#34;对于所有要求完成,我建议使用promises。您可以使用online
将所有请求合并为一个承诺,然后在一切完成后运行回调。
$.when
答案 1 :(得分:1)
$.getJSON
基本上执行AJAX请求,因此只需将全局设置设置为同步:
$.ajaxSetup({
async: false
});
要进行更改,只需将async
设置为true
。
这是一个小伙伴:https://jsfiddle.net/s8fbh02f/