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

标签 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>

最佳答案

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

这意味着您无法回调之外访问在线

如果您想“等待”所有 请求完成,那么我建议使用 promises。您可以使用 $.when 将所有请求组合成一个 promise ,然后在一切完成后运行回调。

var names = ["riotgames", "example"];
var promises = [];

for (var i = 0; i < names.length; i++) {
    // $.getJSON returns a promise
    promises.push($.getJSON('https://api.twitch.tv/kraken/streams/' + names[i]));
}

// Combine all promises
// and run a callback
$.when.apply($, promises).then(function(){
    var online = [];

    // This callback will be passed the result of each AJAX call as a parameter
    for(var i = 0; i < arguments.length; i++){
        // arguments[i][0] is needed because each argument
        // is an array of 3 elements.
        // The data, the status, and the jqXHR object
        online.push(arguments[i][0].stream.channel.display_name);
    }

    console.log(online);
});

关于javascript - 在输出数据之前等待循环完成每个数组项的 $.getJSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35164795/

相关文章:

javascript - 安排抓取作业 - Meteor JS

Javascript、字符串、RegEx、if 和 else if、console.log 不同输出

javascript - 为什么 split 方法仍然返回字符串

javascript - 谷歌地图多边形显示/隐藏切换与复选框

jquery - 颜色选择器不添加到动态 HTML 表

javascript - 如何创建带百分比的进度条?

javascript - 在 HTML/JavaScript 中,有没有办法在图像开始加载时知道图像的最终布局尺寸?

javascript - 将第二个日期选择器设置为比第一个日期选择器早一年

php - 将ajax数据发布到php然后获取数据不起作用

jQuery bxSlider 问题