Как узнать, когда все вызовы ajax завершены - PullRequest
72 голосов
/ 13 ноября 2008

У меня есть страница в стиле таблицы со строками. В каждой строке есть флажок. Я могу установить все / многие флажки и нажать «отправить», и для каждой строки это вызов ajax Jquery.

Обычно у меня есть форма для каждой строки, и я перебираю все проверенные строки и отправляю эту форму, которая выполняет вызов jquery ajax.

Итак, у меня есть кнопка, которая делает:

       $("input:checked").parent("form").submit();

Тогда каждый ряд имеет:

            <form name="MyForm<%=i%>" action="javascript:processRow(<%=i%>)" method="post" style="margin:0px;">
                <input type="checkbox" name="X" value="XChecked"/>
                <input type="hidden" id="XNumber<%=i%>" name="X<%=i%>" value="<%=XNumber%>"/>
                <input type="hidden" id="XId<%=i%>" name="XId<%=i%>" value="<%=XNumber%>"/>
                <input type="hidden" id="XAmt<%=i%>" name="XAmt<%=i%>" value="<%=XAmount%>"/>
                <input type="hidden" name="X" value="rXChecked"/>
            </form>

Эта форма отправляется в processRow:

   function processRow(rowNum)
   {
        var Amount = $('#XAmt'+rowNum).val();
        var XId = $('#XId'+rowNum).val();
        var XNum = $('#OrderNumber'+rowNum).val();
        var queryString = "xAmt=" + "1.00" + "&xNumber=" + OrdNum + "&xId=" + xId;


        $('#coda_'+rowNum).removeClass("loader");
        $('#coda_'+rowNum).addClass("loading");


        $.ajax({
          url: "x.asp",
          cache: false,
          type:  "POST",
          data:  queryString,
          success: function(html){
            $('#result_'+rowNum).empty().append(html);
            $('#coda_'+rowNum).removeClass("loading");
            $('#coda_'+rowNum).addClass("loader");
          }
        });
   }

Что я хотел знать, так это то, как я могу определить, завершены ли все мои Ajax-вызовы. Причина в том, что вы хотите включить / отключить кнопку отправки во время всех этих вызовов.

Спасибо и обратите внимание, что мне пришлось искажать имена переменных из-за чувствительности приложения, поэтому многие из них могут быть продублированы.

Ответы [ 4 ]

129 голосов
/ 13 ноября 2008

Простой способ

Самый простой способ - использовать обработчик событий .ajaxStop() :

$(document).ajaxStop(function() {
  // place code to be executed on completion of last outstanding ajax call here
});

Трудный путь

Вы также можете вручную определить, активен ли какой-либо вызов ajax:

Создайте переменную, содержащую количество активных Ajax-соединений:

var activeAjaxConnections = 0;

непосредственно перед открытием нового Ajax-соединения увеличивайте эту переменную

$.ajax({
  beforeSend: function(xhr) {
    activeAjaxConnections++;
  },
  url (...)

в success частичной проверке, равна ли эта переменная нулю (если так, последнее соединение завершилось)

success: function(html){
  activeAjaxConnections--;
  $('#result_'+rowNum).empty().append(html);
  $('#coda_'+rowNum).removeClass("loading");
  $('#coda_'+rowNum).addClass("loader");
  if (0 == activeAjaxConnections) {
    // this was the last Ajax connection, do the thing
  }
},
error: function(xhr, errDesc, exception) {
  activeAjaxConnections--;
  if (0 == activeAjaxConnections) {
    // this was the last Ajax connection, do the thing
  }
}

Как видите, я добавил также проверку возврата с ошибкой

23 голосов
/ 30 сентября 2011

Оптимальным решением будет использование;

$("body").ajaxStop(function() {
    //Your code
});

Для получения дополнительной информации ознакомьтесь с функцией jQuery .ajaxStop по адресу http://api.jquery.com/ajaxStop/

13 голосов
/ 05 марта 2013

Может быть:

jQuery.active == 0

Украдено у:

http://artsy.github.com/blog/2012/02/03/reliably-testing-asynchronous-ui-w-slash-rspec-and-capybara/

Дополнительная информация о StackOverflow:

jQuery.active function

0 голосов
/ 25 апреля 2016

Как насчет просто использовать , если ?

success: function(html){
   if(html.success == true ){
            $('#result_'+rowNum).empty().append(html);
            $('#coda_'+rowNum).removeClass("loading");
            $('#coda_'+rowNum).addClass("loader");

          }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...