jQuery延迟循环

jQuery延迟循环,jquery,ajax,loops,deferred,Jquery,Ajax,Loops,Deferred,我试图为页面上的每个选中复选框调用ajax函数。一旦所有这些ajax调用都完成了,我想做些别的事情。在下面的示例中,“所有调用已完成”文本在任何“单个调用已完成”文本之前写入控制台。我怎样才能等到所有ajax调用完成?谢谢 function ajax_function() { return $.ajax({ url: "submit.php", type: "POST", dataType: "json", data: form_data, cache

我试图为页面上的每个选中复选框调用ajax函数。一旦所有这些ajax调用都完成了,我想做些别的事情。在下面的示例中,“所有调用已完成”文本在任何“单个调用已完成”文本之前写入控制台。我怎样才能等到所有ajax调用完成?谢谢

function ajax_function() {
  return $.ajax({
    url: "submit.php",
    type: "POST",
    dataType: "json",
    data: form_data,
    cache: false
  })
}

var deferreds = $('input:checkbox:checked.checkprint').map(function(i, elem) {
  $.when(ajax_function()).then(function(data) {
    console.log('single call completed');
    return data;
  });
});

$.when.apply($, deferreds.get()).done(function() {
  console.log('all calls completed');
});

您可以使ajax调用同步

function ajax_function() {
  return $.ajax({
    url: "submit.php",
    type: "POST",
    dataType: "json",
    data: form_data,
    cache: false,
    async:false
  })
}
备选案文2:

var totalnumber = $('input:checkbox:checked.checkprint').length;
var counter   = { t: 0 };
var deferreds = $('input:checkbox:checked.checkprint').map(function(i, elem) {
  $.when(ajax_function(totalnumber,counter)).then(function(data) {
    console.log('single call completed');
    return data;
  });
});

function ajax_function(totalnumber,counter) {
  return $.ajax({
    url: "submit.php",
    type: "POST",
    dataType: "json",
    data: form_data,
    cache: false,

  }).done(function( html ) {
    counter.t++;
    if (counter.t == totalnumber) {
         console.log('all calls completed');
    }
  });
}

为什么是counter.t,因为对象是作为引用传递的,我们需要更改counter.t的值。

我想我已经完成了使用ajaxStop()尝试完成的任务


在我看来,每次点击复选框都发送数据是个坏主意,当用户点击按钮时,你可以放置一个按钮,读取所有这些值并将其发送到服务器。这是可行的,但我希望它们都同时启动。当我更改为async:false时,它会等待每个调用完成,然后再继续。我希望他们一起开始,一旦他们都完成了,继续。
$(document).delegate('#submit_all', 'click', function(e) {
  $('input:checkbox:checked.checkprint').each(function() {
    ajax_function();
  });
  $("#submit_all").one("ajaxStop", function() {
    console.log('all calls completed');
  });
});