Обработка jQuery.ajax продолжается: «success:» vs «.done»?

Я работаю с jQuery и AJAX в течение нескольких недель, и я видел два разных способа «продолжить» сценарий после вызова: success: and .done .

Из краткого обзора документации jQuery мы получаем:

.done (): Описание: Добавить обработчики, вызываемые при разрешении объекта Отложенное.

success: (.ajax () option): функция, вызываемая, если запрос завершается успешно.

Таким образом, оба делают что-то после завершения / разрешения вызова AJAX. Могу ли я использовать одно или другое случайно? В чем разница и когда один используется вместо другого?

success был традиционным названием обратного вызова успеха в jQuery, определяемом как опция в вызове ajax. Однако, поскольку реализация $.Deferreds и более сложных обратных вызовов – это предпочтительный способ реализации успешных обратных вызовов, так как это может быть $.Deferreds любой deferred .

Например, успех:

 $.ajax({ url: '/', success: function(data) {} }); 

Например, сделано:

 $.ajax({url: '/'}).done(function(data) {}); 

Самое приятное в том, что возвращаемое значение $.ajax теперь является отсроченным promiseм, которое может быть привязано к $.ajax в вашем приложении. Итак, допустим, вы хотите сделать этот вызов ajax из нескольких разных мест. Вместо того, чтобы передавать свою функцию успеха в качестве функции функции, которая делает этот вызов ajax, вы можете просто вернуть функцию $.ajax и связать ваши обратные вызовы с done , fail или другим. Обратите внимание, что always является обратным вызовом, который будет работать, будет ли запрос успешным или неудачным. done будет вызвано только успехом.

Например:

 function xhr_get(url) { return $.ajax({ url: url, type: 'get', dataType: 'json', beforeSend: showLoadingImgFn }) .always(function() { // remove loading image maybe }) .fail(function() { // handle request failures }); } xhr_get('/index').done(function(data) { // do stuff with index data }); xhr_get('/id').done(function(data) { // do stuff with id data }); 

Важным преимуществом этого с точки зрения ремонтопригодности является то, что вы завернули свой механизм ajax в специфичную для приложения функцию. Если вы решите, что вам нужен ваш вызов $.ajax для работы по-разному в будущем, или вы используете другой метод ajax или вы xhr_get от jQuery, вам нужно изменить определение xhr_get (обязательно верните promise или, по крайней мере, done метод, в случае примера выше). Все остальные ссылки в приложении могут оставаться неизменными.

Есть еще много (гораздо более $.Deferred ) вещей, которые вы можете сделать с $.Deferred , одним из которых является использование pipe для запуска сбоя при ошибке, сообщаемой сервером, даже когда $.ajax запрос $.ajax преуспевает. Например:

 function xhr_get(url) { return $.ajax({ url: url, type: 'get', dataType: 'json' }) .pipe(function(data) { return data.responseCode != 200 ? $.Deferred().reject( data ) : data; }) .fail(function(data) { if ( data.responseCode ) console.log( data.responseCode ); }); } xhr_get('/index').done(function(data) { // will not run if json returned from ajax has responseCode other than 200 }); 

Подробнее о $.Deferred здесь: http://api.jquery.com/category/deferred-object/

ПРИМЕЧАНИЕ . Начиная с jQuery 1.8, pipe устарела в пользу использования then точно так же.

Если вам нужен async: false в вашем ajax, вы должны использовать success вместо .done . .done вам лучше использовать. Это с официального сайта jQuery :

Начиная с jQuery 1.8, использование async: false с jqXHR ($ .Deferred) устарело; вы должны использовать параметры успеха / ошибки / полного обратного вызова вместо соответствующих методов объекта jqXHR, таких как jqXHR.done () .

  • Как сделать первый вариант , выбранный с помощью jQuery
  • Обновить (перезагрузить) страницу один раз с помощью jQuery?
  • jQuery validator и настраиваемое правило, использующее AJAX
  • jQuery ajax внутри проблемы цикла
  • Как проверить массив входов с помощью validate plugin jquery
  • Получение значения от JQuery datepicker
  • Как перенаправить на другую веб-страницу?
  • jQuery и AngularJS: привязать события к изменению DOM
  • Как использовать jQuery для события click в веб-приложении iPhone
  • В jQuery, как я могу сказать между программным и пользовательским щелчком?
  • Ajax.BeginForm в MVC для загрузки файлов
  • Давайте будем гением компьютера.