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()
?