循环一堆异步操作并等待它们全部完成?

时间:2016-08-02 17:08:01

标签: jquery arrays getjson

(请不要将其标记为重复或至少指向正确答案,因为我处理多个形成数组的请求)。我将一些url调用设置为返回的“data”值作为数组。我计划使用这个数组来创建所有这些值的总和。

var data_num=[];
$.each(arr_urls, function( index, value ) {

  $.getJSON(arr_urls[index], function (data) {
      data_num.push(data);
  });
}); 
alert(data_num);

2 个答案:

答案 0 :(得分:1)

您可能已经熟悉为什么这不起作用,an oft linked duplicate中有很好的解释。但是,这不是完全重复。因为你没有问这个:

  

如何从异步操作返回响应?

你问的是这样的事情:

  

如何循环遍历一堆异步操作并等待它们全部完成?

为此,您首先需要将它们放入数组中。像这样:

var my_promises = [];
var data_num = [];
$.each(arr_urls, function( index, value ) {
  my_promises.push($.getJSON(arr_urls[index], function (data) {
      data_num.push(data);
  }));
}); 

这应该给你一个名为promises的数组,它保存对当前正在执行的异步操作的引用。现在你只需要等待它们全部完成。像这样:

$.when.apply($, my_promises).then(function() {
    alert(data_num);
});

这应该将.when()函数应用于整个promises数组,只有在整个数组完成后才执行回调。

答案 1 :(得分:-1)

我会假设你不能做那个服务器端(这是最好的事情)。

好的,第一件事:你为什么要做$.getJSON(arr_urls[index]?如果您想使用$.each,则应使用value,甚至更好:使用进行循环

for (var i = arr_urls.length - 1; i >= 0; i--) {
     arr_urls[i]
}

另外,为什么不尝试使用console.log(data)在JavaScript控制台上查看返回的内容?您的浏览器控制台甚至可以告诉您对网站URL的请求是否有错误。