В чем разница между успехом и методом .done () в $ .ajax? - PullRequest
97 голосов
/ 13 января 2012

Кто-нибудь может мне помочь?
Я не могу понять разницу между success и .done() из $.ajax.

Если возможно, приведите примеры.

Ответы [ 4 ]

99 голосов
/ 13 января 2012

success срабатывает только в случае успешного вызова AJAX, то есть в конечном итоге возвращает статус HTTP 200. error срабатывает в случае сбоя и complete при завершении запроса независимо от успеха.

В jQuery 1.8 для объекта jqXHR (возвращается $.ajax) success был заменен на done, error на fail и complete на always.

Однако вы все равно сможете инициализировать запрос AJAX со старым синтаксисом. Итак, они делают похожие вещи:

// set success action before making the request
$.ajax({
  url: '...',
  success: function(){
    alert('AJAX successful');
  }
});

// set success action just after starting the request
var jqxhr = $.ajax( "..." )
  .done(function() { alert("success"); });

Это изменение для совместимости с отложенным объектом в jQuery 1.5. Отложенный (и теперь Promise, который имеет полную поддержку встроенного браузера в Chrome и FX) позволяет вам связывать асинхронные действия:

$.ajax("parent").
    done(function(p) { return $.ajax("child/" + p.id); }).
    done(someOtherDeferredFunction).
    done(function(c) { alert("success: " + c.name); });

Эта цепочка функций проще в обслуживании, чем вложенная пирамида обратных вызовов, которую вы получаете с success.

Тем не менее, обратите внимание, что done теперь не рекомендуется в пользу синтаксиса Promise, в котором вместо него используется then:

$.ajax("parent").
    then(function(p) { return $.ajax("child/" + p.id); }).
    then(someOtherDeferredFunction).
    then(function(c) { alert("success: " + c.name); }).
    catch(function(err) { alert("error: " + err.message); });

Это стоит принять, потому что расширение async и await обещает улучшенный синтаксис (и обработку ошибок):

try {
    var p = await $.ajax("parent");
    var x = await $.ajax("child/" + p.id);
    var c = await someOtherDeferredFunction(x);
    alert("success: " + c.name);
}
catch(err) { 
    alert("error: " + err.message); 
}
10 голосов
/ 13 января 2012

Короче говоря, отключение функции обратного вызова success от функции ajax, чтобы позже вы могли добавлять свои собственные обработчики без изменения исходного кода (шаблон наблюдателя).

Более подробную информацию вы найдете здесь: https://stackoverflow.com/a/14754681/1049184

5 голосов
/ 13 января 2012

.success() вызывается только в том случае, если ваш веб-сервер отвечает HTTP-заголовком 200 OK - в основном, когда все в порядке.

Обратные вызовы, прикрепленные к done (), будут запущены при разрешении отложенного ответа.Обратные вызовы, прикрепленные к fail (), будут запущены при отклонении отложенного ответа.

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback
0 голосов
/ 13 января 2012

success - это обратный вызов, который вызывается при успешном выполнении запроса и является частью вызова $.ajax. done фактически является частью объекта jqXHR, возвращаемого $.ajax(), и заменяет success в jQuery 1.8.

...