在输出数据之前,等待循环为每个数组项完成$ .getJSON

时间:2016-02-02 22:13:37

标签: javascript jquery

我有一个名字数组,我需要从中检索数据,而我现在正在循环中使用$ .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>

2 个答案:

答案 0 :(得分:4)

执行$.getJSON时,您正在触发异步请求。这意味着它们在后台运行。您没有等待让他们完成,他们的回调将在请求完成后触发(如事件)。

这意味着您无法外部访问回复{/ 1>。

如果你想等待&#34;对于所有要求完成,我建议使用promises。您可以使用online将所有请求合并为一个承诺,然后在一切完成后运行回调。

$.when

答案 1 :(得分:1)

$.getJSON基本上执行AJAX请求,因此只需将全局设置设置为同步:

$.ajaxSetup({
    async: false
});

要进行更改,只需将async设置为true

这是一个小伙伴:https://jsfiddle.net/s8fbh02f/