successwar der traditionelle Name des Erfolgsrückrufs in jQuery, der als Option im Ajax-Aufruf definiert wurde. Da jedoch die Implementierung $.Deferredsund komplexere Rückrufe doneder 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 doneist, dass der Rückgabewert von $.ajaxjetzt 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 alwaysein Rückruf ist, der ausgeführt wird, unabhängig davon, ob die Anforderung erfolgreich ist oder fehlschlägt. donewird 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_getDefinition ändern (stellen Sie sicher, dass Sie ein Versprechen oder zumindest eine doneMethode 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 $.Deferredkönnen. Eine davon ist, pipeeinen 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 pipedie Verwendung thenauf genau die gleiche Weise abgelehnt .
success:/.done()definiert sind, wenn überhaupt. ZB wird heutzutagesuccess:nur als erstes implementiert.done()?