jaka jest różnica między metodą success i .done () w $ .ajax


102

Czy ktoś może mi pomóc?
Nie jestem w stanie zrozumieć różnicy między successi .done()of $.ajax.

Jeśli to możliwe, proszę podać przykłady.


gdzie czytałeś o metodzie done () metody $ .ajax ()? AFAIK wykonana metoda jest powiązana z obiektem $ .Deferred. Może zamiast tego mówisz o .complete ()?
Fabrizio Calderan


2
ok, to jQuery 1.8 :) Ponieważ $ .ajax zwraca obietnicę z jQuery 1.5 jest to proste podstawienie dla sprawy spójności (przy użyciu interfejsu deferred): done () zajmuje miejsce sukcesu (), fail () zamiast błędu () i zawsze () dla pełnego ()
Fabrizio Calderan

2
Prawdziwa zmiana polega na tym, że można programowo dołączyć wiele wywołań zwrotnych. Spójrz na stronę dokumentacji $ .Deferred.
Fabrizio Calderan

Odpowiedzi:


8

W skrócie, oddzielenie funkcji wywołania zwrotnego sukcesu od funkcji ajax, aby później można było dodać własne programy obsługi bez modyfikowania oryginalnego kodu (wzorca obserwatora).

Więcej szczegółowych informacji można znaleźć tutaj: https://stackoverflow.com/a/14754681/1049184


1
A poniżej przykład odwzorowuje równoważność done =>
Success

25
Ta odpowiedź mija się z celem. Istnieje różnica między wartością success: używaną jako parametr a .success()metodą w pliku jqXHR. Ten ostatni jest przestarzały, ale o to pierwsze pytał OP.
Alnitak

2
Sukces / błąd / ukończenie są przestarzałe i oparte na zmianach stanu AJAX; done / fail / zawsze są oparte na zmianach stanu odroczonego jQuery. Zobacz api.jquery.com/category/deferred-object .
mickeyreiss

28
Nie mogę uwierzyć, że odpowiedź, która błędnie interpretuje pytanie, jest zarówno najwyższym głosowaniem, jak i zaakceptowanym rozwiązaniem ...
Transcendencja,

108

successuruchamia się tylko wtedy, gdy wywołanie AJAX powiedzie się, tj. ostatecznie zwraca stan HTTP 200. erroruruchamia się, jeśli się nie powiedzie i completepo zakończeniu żądania, niezależnie od powodzenia.

JQuery 1,8 na jqXHRprzedmiot (zwracany przez $.ajax) successzostał zastąpiony przez done, errorw faili completez always.

Jednak nadal powinieneś być w stanie zainicjować żądanie AJAX przy użyciu starej składni. Więc te robią podobne rzeczy:

// 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"); });

Ta zmiana ma na celu zapewnienie zgodności z odroczonym obiektem jQuery 1.5 . Deferred (a teraz Promise, który ma pełną natywną obsługę przeglądarek w Chrome i FX) pozwala na łańcuchowe działania asynchroniczne:

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

Ten łańcuch funkcji jest łatwiejszy do utrzymania niż zagnieżdżona piramida wywołań zwrotnych success.

Należy jednak pamiętać, że donejest to obecnie przestarzałe na rzecz Promiseskładni, która thenzamiast tego używa :

$.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); });

Warto to przyjąć, ponieważ asynci awaitrozszerza obietnice ulepszonej składni (i obsługi błędów):

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); 
}

tworzenie funkcji przed zgłoszeniem żądania i ustawianie funkcji po zgłoszeniu żądania. Wygląda na to, że oba są takie same ... czy pokażesz mi inne różnice ???
suhailvs

@suhail - tak naprawdę nie ma; w jQuery 1.6 było success, w jQuery 1.8 zostało zastąpione przez done. Działają w ten sam sposób, ale donesą bardziej spójne z resztą jQuery.
Keith,

@Keith, więc dzisiaj używanie .done jest tym samym, co używanie sukcesu? czy jest coś jeszcze nowszego?
Roxy'Pro

@ Roxy'Pro to było nieaktualne, kiedy odpowiedziałem, na pewno nie użyłbym tego w 2018. To .donebył wczesny (i teraz ślepy zaułek) jQuery pchnięcie na to, co się stało Promisei teraz ma dość kompleksową obsługę języków. W nowych projektach używałbym const response = await fetch(...)zamiast tego.
Keith

6

.success() jest wywoływany tylko wtedy, gdy serwer WWW odpowie 200 OK nagłówkiem HTTP - w zasadzie, gdy wszystko jest w porządku.

Wywołania zwrotne dołączone do done () zostaną uruchomione, gdy odroczony zostanie rozwiązany. Wywołania zwrotne dołączone do fail () zostaną uruchomione, gdy odroczony zostanie odrzucony.

promise.done(doneCallback).fail(failCallback)

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

3
Warto zauważyć, że .success () NIE jest wywoływana, gdy nieprawidłowo sformułowany kod JSON jest wysyłany z powrotem z kodem stanu 200 / OK. W szczególności napotkałem problem z kodem zaplecza serwera internetowego, który generuje wartości NaN i serializuje je jako javascript NaN (tj. Jako symbol, a nie ciąg „NaN”), który w rzeczywistości nie jest prawidłowym formatem JSON - więc parsowanie odpowiedzi jako JSON nie powiedzie się i .fail () jest wykonywana, ale status odpowiedzi to 200. Ale nadal jest prawdą, że powodzenie TYLKO jest wywoływane z kodem statusu OK; chciałem tylko zaznaczyć, że to, że jest OK, nie oznacza, że ​​jest „sukces”;)
Kasapo

1

successto wywołanie zwrotne, które jest wywoływane, gdy żądanie się powiedzie i jest częścią $.ajaxpołączenia. donejest faktycznie częścią jqXHRobiektu zwróconego przez $.ajax()i zastępuje successw jQuery 1.8.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.