Was ist der Unterschied zwischen Erfolg und .done () -Methode von $ .ajax?


102

Kann mir jemand helfen?
Ich kann den Unterschied zwischen successund .done()von nicht verstehen $.ajax.

Wenn möglich, geben Sie bitte Beispiele.


Wo haben Sie über eine done () -Methode von $ .ajax () gelesen? AFAIK Die Methode done bezieht sich auf das Objekt $ .Deferred. Vielleicht sprechen Sie stattdessen von .complete ()?
Fabrizio Calderan


2
ok, es ist jQuery 1.8 :) Da $ .ajax ein Versprechen von jQuery 1.5 zurückgibt, ist dies eine einfache Ersetzung für eine Frage der Konsistenz (unter Verwendung der Schnittstelle von verzögert): done () anstelle von success (), fail () für Fehler () und immer () für vollständig ()
Fabrizio Calderan

2
Die eigentliche Änderung besteht darin, dass Sie programmgesteuert mehrere Rückrufe anhängen können. Schauen Sie sich die $ .Deferred-Dokumentationsseite an.
Fabrizio Calderan

1
Mögliches Duplikat der Behandlung
BuZZ-dEE

Antworten:


8

Kurz gesagt, Entkoppeln der erfolgreichen Rückruffunktion von der Ajax-Funktion, damit Sie später Ihre eigenen Handler hinzufügen können, ohne den ursprünglichen Code (Beobachtermuster) zu ändern.

Weitere Informationen finden Sie hier: https://stackoverflow.com/a/14754681/1049184


1
Und darunter zeigt das Beispiel die Äquivalenz von erledigt => Erfolg,
Misserfolg

25
Diese Antwort verfehlt den Punkt. Es gibt einen Unterschied zwischen der success: Verwendung als Parameter und .success()als Methode für a jqXHR. Letzteres wird abgelehnt, aber Ersteres ist das, wonach das OP gefragt hat.
Alnitak

2
Erfolg / Fehler / Abschluss sind veraltet und basieren auf AJAX-Statusänderungen. done / fail / always basieren immer auf jQuery Deferred-Statusänderungen. Siehe api.jquery.com/category/deferred-object .
Mickeyreiss

28
Ich kann nicht glauben, dass eine Antwort, die die Frage falsch interpretiert, sowohl die am höchsten gewählte als auch die akzeptierte Lösung ist ...
Transzendenz

108

successWird nur ausgelöst, wenn der AJAX-Aufruf erfolgreich ist, dh letztendlich einen HTTP 200-Status zurückgibt. errorWird ausgelöst, wenn dies fehlschlägt und completewenn die Anforderung beendet ist, unabhängig vom Erfolg.

In jQuery 1.8 wurde das jqXHRObjekt (zurückgegeben von $.ajax) successdurch done, errormit failund completemit ersetzt always.

Sie sollten jedoch weiterhin in der Lage sein, die AJAX-Anforderung mit der alten Syntax zu initialisieren. Diese machen also ähnliche Dinge:

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

Diese Änderung dient der Kompatibilität mit dem zurückgestellten Objekt von jQuery 1.5 . Mit Deferred (und jetzt Promisemit vollständiger Unterstützung für native Browser in Chrome und FX) können Sie asynchrone Aktionen verketten:

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

Diese Funktionskette ist einfacher zu pflegen als eine verschachtelte Pyramide von Rückrufen, mit denen Sie arbeiten success.

Beachten Sie jedoch, dass dies donejetzt zugunsten der stattdessen Promiseverwendeten Syntax veraltet ist 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); });

Dies ist eine Übernahme wert, da asyncund awaiterweitert eine verbesserte Syntax (und Fehlerbehandlung) verspricht:

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

Funktionserstellung vor der Anforderung und Festlegen der Funktion nach der Anforderung. Sieht so aus, als wären beide gleich ... zeigst du mir noch ein paar Unterschiede ???
Suhailvs

@suhail - es gibt eigentlich keine; in jQuery 1.6 gab es success, in jQuery 1.8 wurde das durch ersetzt done. Sie funktionieren auf die gleiche Weise, sind jedoch donekonsistenter mit dem Rest von jQuery.
Keith

@Keith also ist die Verwendung von .done heute dasselbe wie die Verwendung von Erfolg? oder gibt es noch etwas noch neueres?
Roxy'Pro

@ Roxy'Pro das war veraltet, als ich es beantwortete, ich würde es 2018 sicherlich nicht verwenden. Es .donewar jQuerys früher (und jetzt Sackgasse) Stich in das, was wurde Promiseund das hat jetzt eine ziemlich umfassende Sprachunterstützung. In neuen Projekten würde ich const response = await fetch(...)stattdessen verwenden.
Keith

6

.success() wird nur aufgerufen, wenn Ihr Webserver mit einem HTTP-Header mit 200 OK antwortet - im Grunde genommen, wenn alles in Ordnung ist.

Die an done () angehängten Rückrufe werden ausgelöst, wenn der Aufschub behoben ist. Die an fail () angehängten Rückrufe werden ausgelöst, wenn die Zurückstellung abgelehnt wird.

promise.done(doneCallback).fail(failCallback)

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

3
Es ist erwähnenswert, dass .success () NICHT aufgerufen wird, wenn fehlerhafter JSON mit einem 200 / OK-Statuscode zurückgesendet wird. Insbesondere bin ich auf ein Problem mit dem Webserver-Backend-Code gestoßen, der NaN-Werte generiert und diese als Javascript-NaN (dh als Symbol, nicht als Zeichenfolge 'NaN') serialisiert, was eigentlich kein gültiger JSON ist - also das Parsen der Antwort als JSON schlägt fehl und .fail () wird ausgeführt, aber der Antwortstatus ist 200. Es ist jedoch immer noch wahr, dass Erfolg NUR mit einem OK-Statuscode aufgerufen wird. Ich wollte nur darauf hinweisen, dass nur weil es in Ordnung ist, es nicht "erfolgreich" bedeutet;)
Kasapo

0

successist der Rückruf, der aufgerufen wird, wenn die Anforderung erfolgreich ist und Teil des $.ajaxAufrufs ist. doneist tatsächlich Teil des von zurückgegebenen jqXHRObjekts $.ajax()und wird successin jQuery 1.8 ersetzt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.