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


102

Хтось може мені допомогти?
Я не в змозі зрозуміти різницю між successі .done()з $.ajax.

Якщо можливо, наведіть приклади.


де ви читали про виконаний () метод $ .ajax ()? AFAIK виконаний метод пов'язаний з $ .Deferred об'єктом. Можливо, ви замість цього говорите про .complete ()?
Фабріціо Кальдеран


2
ок, це jQuery 1.8 :) Оскільки $ .ajax повертає обіцянку від jQuery 1.5, це проста заміна питання послідовності (використовуючи інтерфейс відкладеного): done () має місце успіх (), fail () для помилки () і завжди () для завершення ()
Фабріціо Кальдеран

2
Справжня зміна полягає в тому, що ви можете приєднувати декілька зворотних дзвінків програмно. Подивіться на сторінку.
Фабріціо Кальдеран

Відповіді:


8

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

Детальну інформацію можна знайти тут: https://stackoverflow.com/a/14754681/1049184


1
А під цим прикладом відображається еквівалентність виконаного => успіху, невдачі => помилки і завжди => повного
StuartLC

25
Ця відповідь пропускає суть. Існує різниця між success: використовуваним як параметром і .success()як методом на a jqXHR. Останнє застаріло, але перше - про що просив ОП.
Альнітак

2
Успіх / помилка / завершеність застаріли і базуються на змінах стану AJAX; зроблено / не вдалося / завжди базуються на змінах стану відкладеного jQuery. Див. Api.jquery.com/category/deferred-object .
mickeyreiss

28
я не можу повірити у відповідь, що неправильно трактує питання - це і найвищий голос, і прийняте рішення ...
Трансцендент

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

@ Roxy'Pro це застаріло, коли я відповів на це, я, безумовно, не використовував би це в 2018 році. .doneБув ранній (і тепер тупиковий) jQuery, коли він став, Promiseі що тепер має достатньо всебічну підтримку мови. У нових проектах я б використовував const response = await fetch(...)замість цього.
Кіт

6

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

Відкликані дзвінки, приєднані до done (), будуть зняті, коли відстрочка буде вирішена. Відкликані дзвінки, приєднані до fail (), будуть зняті, коли відкладене відхилено.

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback

3
Варто зазначити, що .success () НЕ дзвонить, коли неправильно сформований JSON повертається назад з кодом статусу 200 / ОК. Зокрема, я зіткнувся з проблемою із кодом, що веде сервер веб-сервера, генеруючи значення NaN і серіалізуючи їх як javascript NaN (тобто як символ, а не рядок 'NaN'), який насправді не є дійсним JSON - так що аналіз відповіді як JSON виходить з ладу і .fail () виконується, але статус відповіді - 200. Але все-таки правда, що успіх ТІЛЬКИ викликається кодом статусу ОК; просто хотів зазначити, що те, що це нормально, не означає, що це "успішно";)
Касапо

1

successце зворотний виклик, який викликається, коли запит успішний і є частиною $.ajaxвиклику. doneнасправді частина jqXHRоб'єкта, повернута $.ajax()і замінюється successв jQuery 1.8.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.