【问题标题】:Loop over a bunch of asynchronous operations and wait for them all to finish?循环一堆异步操作并等待它们全部完成?
【发布时间】:2016-08-03 16:23:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: jquery arrays getjson


    【解决方案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() 函数应用于整个promise 数组,仅在整个数组完成时执行回调。

    【讨论】:

      【解决方案2】:

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

      好的,第一件事:你为什么要$.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 的请求是否有错误。

      【讨论】:

      猜你喜欢
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2017-02-15
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多