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

Loop over a bunch of asynchronous operations and wait for them all to finish?

(请不要标记为重复或至少指出正确答案,因为我在这里处理多个请求以形成一个数组)。我使用返回的 "data" 值作为数组设置了一些 url 调用。我打算使用这个数组来创建所有这些值的总和。

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

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

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

How do I return the response from an asynchronous operation?

你问的更像这样:

How do I loop over a bunch of asynchronous operations and wait for them all to finish?

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

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() 函数应用于整个承诺数组,仅在整个数组完成时执行回调。

我假设你不能在服务器端做(这是最好的做法)。

好的,首先要做的事情是:你为什么要做$.getJSON(arr_urls[index]?如果你想使用 $.each,你应该使用 value,或者更好:使用 for 循环

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

此外,您为什么不尝试执行 console.log(data) 以在 JavaScript 控制台上查看返回的内容?如果对站点 URL.

的请求有误,您的浏览器控制台甚至可以告诉您