в чем разница между успехом и методом .done () $ .ajax

102

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

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

Пунам Бхатт
источник
где вы читали о методе done () $ .ajax ()? AFAIK, метод done связан с объектом $ .Deferred. Может быть, вы вместо этого говорите о .complete ()?
Fabrizio Calderan
1
на странице api.jquery.com/jQuery.ajax
Пунам Бхатт,
2
хорошо, это jQuery 1.8 :) Поскольку $ .ajax возвращает обещание из jQuery 1.5, это простая замена для обеспечения согласованности (с использованием интерфейса deferred): done () заменяет success (), fail () для ошибки () и всегда () для завершения ()
Фабрицио Кальдеран
2
Настоящее изменение заключается в том, что вы можете программно присоединить несколько обратных вызовов. См. Страницу документации $ .Deferred.
Fabrizio Calderan

Ответы:

8

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

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

Батбаатар
источник
1
А под ним в примере отображается эквивалентность готово => успех, сбой => ошибка и всегда => завершено
StuartLC
25
Этот ответ упускает суть. Существует разница между success: использованием в качестве параметра и .success()метода в файле jqXHR. Последний устарел, но первый - это то, о чем спрашивал OP.
Alnitak
2
Успех / ошибка / завершение устарели и основаны на изменениях состояния AJAX; done / fail / always основаны на изменениях отложенного состояния jQuery. См. Api.jquery.com/category/deferred-object .
mickeyreiss
28
Я не могу поверить, что ответ, который неверно истолковывает вопрос, является одновременно наиболее проголосованным и принятым решением ...
Transcendence
108

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); 
}
Кит
источник
создание функции перед отправкой запроса и установка функции после отправки запроса. Похоже, оба они одинаковые ... покажете мне еще какие-нибудь различия ???
suhailvs
@suhail - их на самом деле нет; в jQuery 1.6 был success, в jQuery 1.8 он был заменен на done. Они работают одинаково, но doneбольше соответствуют остальной части jQuery.
Кейт
@Keith, так что сегодня использование .done - то же самое, что использовать успех? или есть еще что то новее?
Roxy'Pro 01
@ Roxy'Pro это было устаревшим, когда я ответил на него, я определенно не стал бы использовать это в 2018 году. .doneБыл ранний (а теперь тупиковый) удар jQuery в то, что стало Promiseи теперь имеет довольно полную языковую поддержку. В новых проектах я бы использовал const response = await fetch(...)вместо этого.
Кит
6

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

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

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback
Самира Тилакасири
источник
4
Стоит отметить, что .success () НЕ вызывается, когда искаженный JSON отправляется обратно с кодом состояния 200 / OK. В частности, я столкнулся с проблемой с кодом серверной части веб-сервера, генерирующим значения NaN и сериализирующим их как javascript NaN (то есть как символ, а не строку «NaN»), который на самом деле не является допустимым JSON, поэтому анализ ответа как JSON терпит неудачу и выполняется .fail (), но статус ответа - 200. Но все же верно, что успех вызывается ТОЛЬКО с кодом статуса OK; просто хотел указать на то, что то, что это нормально, не означает, что он «успешен»;)
Kasapo
1

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

devdigital
источник