0

我正在尝试为页面上每个选定的复选框调用 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');
});
4

2 回答 2

1

您可以使您的 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的值。

于 2013-02-21T04:51:05.383 回答
0

我想我使用 ajaxStop ( http://api.jquery.com/ajaxStop/ )完成了我想做的事情

$(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');
  });
});
于 2013-02-21T16:15:00.880 回答