jquery :: ajaxStop () против jquery :: ajaxComplete () - PullRequest
38 голосов
/ 12 декабря 2010

Который должен быть использован в какое время.

В документации на http://api.jquery.com/:

Для ajaxStop () он говорит:

Описание: Зарегистрировать обработчик, который будет вызываться после завершения всех запросов Ajax. Это Ajax Event.

А для ajaxComplete () он говорит:

Описание: Зарегистрировать обработчик, который будет вызываться при завершении запросов Ajax. Это Ajax Event.

Из того, что я вижу, ajaxComplete () более гибок благодаря:

Все обработчики ajaxComplete вызываются независимо от того, какой запрос Ajax был выполнен. Если мы должны различать запросы, мы можем использовать параметры, передаваемые обработчику. Каждый раз, когда выполняется обработчик ajaxComplete, ему передается объект события, объект XMLHttpRequest и объект настроек, который использовался при создании запроса.

Может ли кто-нибудь объяснить, для чего предназначен каждый из них и как его использовать. В приложении, которое я недавно построил, я использовал ajaxStop () для запуска, когда мои вызовы ajax были завершены. Затем я бы проанализировал возвращенные данные для результата работы на стороне сервера. Теперь я начинаю задаваться вопросом, должен ли я использовать вместо этого ajaxComplete () или их комбинацию для различных ситуаций.

Мысли приветствуются.

Ответы [ 3 ]

58 голосов
/ 12 декабря 2010

Ну, вкратце, они служат разным целям, поэтому ответом будет вариант «сочетание обоих для разных ситуаций». Основные правила:

  • .ajaxComplete() - работает для каждый запрос , который завершается, используйте его, если вы хотите что-то сделать с каждым запросом / результатом. Обратите внимание, что это не заменяет обработчик success, так как проанализированные данные не являются одним из аргументов (и он запускается даже при возникновении ошибки) - вы можете захотеть .ajaxSuccess() в некоторых случаях. вместо этого запрашивайте ситуации.
  • .ajaxStop() - запускается, когда каждая партия запросов завершается, обычно вы используете это в сочетании с .ajaxStart() для таких вещей, как показ / скрытие какого-либо индикатора «Загрузка ...» или выполнение чего-либо еще после завершения пакета AJAX-запросов, например, последний шаг мастера.

Если вы используете это для анализа ваших данных, возможно, есть лучший способ, в данном случае $.ajaxSetup(), где вы можете указать обработчик success, который будет получать уже проанализированные данные ( например, ответы JSON будут объектами), например:

$.ajaxSetup({
  success: function(data) { 
    //do something with data, for JSON it's already an object, etc.
  }
});
8 голосов
/ 12 декабря 2010

ajaxComplete вызывается всякий раз, когда ajax-запрос заканчивается, либо успешно, либо с ошибкой.

ajaxStop вызывается, когда все ajax-запросы завершаются.Поэтому, в отличие от ajaxComplete, он не будет вызываться, если все еще выполняется запрос.

Вы должны использовать первое, если операция, которую вы хотите выполнить, должна выполняться для каждого запроса ajax.

3 голосов
/ 12 декабря 2010

В общем, вы хотите использовать ajaxComplete. Это связано с тем, что ajaxStop будет запускаться только тогда, когда больше нет запросов ajax, ожидающих возврата. Это может не выглядеть по-разному, когда вы отправляете один ajax-запрос за раз, но представьте, что после отправки запроса A сеть замедлилась и, когда запрос B отправляется через 5 секунд, он возвращается раньше, чем запрос A . затем ajaxStop сработает только один раз после того, как запрос A вернется, а ajaxComplete сработает оба раза.

Ситуация, когда вы используете ajaxStop, - это когда вы отправляете несколько запросов AJAX за один раз ... например. отправить серию из 3 форм ... и хотите получать уведомления, когда все 3 успешно завершены. Конечно, вы можете достичь той же функциональности с помощью счетчика в пределах ajaxComplete

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

$.ajax({
   url: "blah",
   data: "blah",
   success: function (data) { /* Code in here */ }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...