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 に答える