success
war der traditionelle Name des Erfolgsrückrufs in jQuery, der als Option im Ajax-Aufruf definiert wurde. Da jedoch die Implementierung $.Deferreds
und komplexere Rückrufe done
der bevorzugte Weg ist, um erfolgreiche Rückrufe zu implementieren, wie sie bei jedem aufgerufen werden können deferred
.
Zum Beispiel Erfolg:
$.ajax({
url: '/',
success: function(data) {}
});
Zum Beispiel erledigt:
$.ajax({url: '/'}).done(function(data) {});
Das Schöne daran done
ist, dass der Rückgabewert von $.ajax
jetzt ein aufgeschobenes Versprechen ist, das an eine andere Stelle in Ihrer Anwendung gebunden werden kann. Nehmen wir also an, Sie möchten diesen Ajax-Anruf von verschiedenen Orten aus tätigen. Anstatt Ihre Erfolgsfunktion als Option an die Funktion zu übergeben, die diesen Ajax-Aufruf ausführt, können Sie einfach die Funktion zurückgeben lassen$.ajax
selbst und binden Sie Ihre Rückrufe mit done
, fail
, then
, oder was auch immer. Beachten Sie, dass dies always
ein Rückruf ist, der ausgeführt wird, unabhängig davon, ob die Anforderung erfolgreich ist oder fehlschlägt. done
wird nur bei Erfolg ausgelöst.
Zum Beispiel:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json',
beforeSend: showLoadingImgFn
})
.always(function() {
// remove loading image maybe
})
.fail(function() {
// handle request failures
});
}
xhr_get('/index').done(function(data) {
// do stuff with index data
});
xhr_get('/id').done(function(data) {
// do stuff with id data
});
Ein wichtiger Vorteil in Bezug auf die Wartbarkeit besteht darin, dass Sie Ihren Ajax-Mechanismus in eine anwendungsspezifische Funktion eingebunden haben. Wenn Sie sich entscheiden, brauchen Sie Ihre$.ajax
Anruf in Zukunft anders funktionieren soll, oder wenn Sie eine andere Ajax-Methode verwenden oder sich von jQuery entfernen, müssen Sie nur die xhr_get
Definition ändern (stellen Sie sicher, dass Sie ein Versprechen oder zumindest eine done
Methode zurückgeben) der Fall des obigen Beispiels). Alle anderen Referenzen in der App können gleich bleiben.
Es gibt viel mehr (viel coolere) Dinge, die Sie tun $.Deferred
können. Eine davon ist, pipe
einen Fehler bei einem vom Server gemeldeten Fehler auszulösen, selbst wenn der$.ajax
Anforderung selbst erfolgreich ist . Zum Beispiel:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json'
})
.pipe(function(data) {
return data.responseCode != 200 ?
$.Deferred().reject( data ) :
data;
})
.fail(function(data) {
if ( data.responseCode )
console.log( data.responseCode );
});
}
xhr_get('/index').done(function(data) {
// will not run if json returned from ajax has responseCode other than 200
});
Lesen Sie mehr über $.Deferred
: http://api.jquery.com/category/deferred-object/
HINWEIS : Ab jQuery 1.8 wurde pipe
die Verwendung then
auf genau die gleiche Weise abgelehnt .
success:
/.done()
definiert sind, wenn überhaupt. ZB wird heutzutagesuccess:
nur als erstes implementiert.done()
?success:
und.done
einen Ajax-Anruf hast ? Gute Frage. Da alle anderen Rückrufe in der Reihenfolge aufgerufen werden, in der sie gebunden sind, ist meine Vermutung ja,success
wird nur zuerst aufgerufen.pipe
ist eines, bei dem die Anforderung selbst erfolgreich ist, das Skript auf dem Server jedoch nicht das zurückgegeben hat, wonach Sie gesucht haben. Möglicherweise möchten Sie keine tatsächlichen 404 oder 500 oder was auch immer auf die Serverseite werfen, da Sie sinnvoll zwischen http-Antworten und Anwendungsantworten unterscheiden möchten. Wenn Sie einen Antwortcode in JSON festlegen und dann aufpipe
diese Weise verwenden, können Sie verschiedene Arten von Fehlern nuancierter behandeln.Wenn Sie
async: false
in Ihrem Ajax benötigen , sollten Siesuccess
anstelle von verwenden.done
. Sonst bist du besser zu benutzen.done
. Dies ist von der offiziellen jQuery-Website :quelle
async:false
?$.ajax({ url: req_url, ..., async: false, success: function (result, status, req) { }, error: function (jqXHR, status) { } });
Die ab
$.ajax()
jQuery 1.5 zurückgegebenen jqXHR-Objekte implementieren die Promise-Schnittstelle und geben ihnen alle Eigenschaften, Methoden und das Verhalten eines Promise ( weitere Informationen finden Sie unter Zurückgestelltes Objekt ). Diese Methoden verwenden ein oder mehrere Funktionsargumente, die beim$.ajax()
Beenden der Anforderung aufgerufen werden . Auf diese Weise können Sie einer einzelnen Anforderung mehrere Rückrufe zuweisen und sogar Rückrufe zuweisen, nachdem die Anforderung möglicherweise abgeschlossen wurde. (Wenn die Anforderung bereits abgeschlossen ist, wird der Rückruf sofort ausgelöst.) Zu den verfügbaren Promise-Methoden des jqXHR-Objekts gehören:Ein alternatives Konstrukt zur Option
deferred.done()
für einen erfolgreichen Rückruf finden Sie in den Implementierungsdetails.Als alternatives Konstrukt zur Fehlerrückrufoption
.fail()
ersetzt die Methode die veraltete .error () -Methode. Einzelheiten zur Implementierung finden Sie unter deferred.fail ().(hinzugefügt in jQuery 1.6) Die
.always()
Methode ist ein alternatives Konstrukt zur vollständigen Rückrufoption und ersetzt die veraltete.complete()
Methode.Als Antwort auf eine erfolgreiche Anforderung sind die Argumente der Funktion dieselben wie die von
.done()
: data, textStatus und dem jqXHR-Objekt. Für fehlgeschlagene Anforderungen sind die Argumente dieselben wie die von.fail()
: jqXHR object, textStatus und errorThrown. Siehedeferred.always()
für Implementierungsdetails.Enthält die Funktionalität der Methoden
.done()
und.fail()
, sodass (ab jQuery 1.8) das zugrunde liegende Versprechen manipuliert werden kann. Siehe latenten.then()
für Implementierungsdetails.quelle