Die "neue" Methode seit jQuery 1.5 (Januar 2011) besteht darin, verzögerte Objekte zu verwenden, anstatt einen successRückruf zu übergeben. Sie sollten Rückkehr das Ergebnis $.ajaxund verwenden Sie dann die .done, .failetc Methoden , um die Rückrufe hinzufügen außerhalb des $.ajaxAnrufs .
function getData() {
return $.ajax({
url : 'example.com',
type: 'GET'
});
}
function handleData(data /* , textStatus, jqXHR */ ) {
alert(data);
//do some stuff
}
getData().done(handleData);
Dadurch wird die Rückrufbehandlung von der AJAX-Behandlung entkoppelt , und Sie können mehrere Rückrufe, Fehlerrückrufe usw. hinzufügen, ohne jemals die ursprüngliche getData()Funktion ändern zu müssen. Es ist eine gute Sache, die AJAX-Funktionalität von den danach auszuführenden Aktionen zu trennen! .
Zurückgestellte ermöglichen auch eine viel einfachere Synchronisation mehrerer asynchroner Ereignisse, mit denen Sie nicht einfach umgehen können success:
Zum Beispiel könnte ich mehrere Rückrufe hinzufügen, einen Fehlerbehandler, und warten, bis ein Timer abgelaufen ist, bevor ich fortfahre:
// a trivial timer, just for demo purposes -
// it resolves itself after 5 seconds
var timer = $.Deferred();
setTimeout(timer.resolve, 5000);
// add a done handler _and_ an `error:` handler, even though `getData`
// didn't directly expose that functionality
var ajax = getData().done(handleData).fail(error);
$.when(timer, ajax).done(function() {
// this won't be called until *both* the AJAX and the 5s timer have finished
});
ajax.done(function(data) {
// you can add additional callbacks too, even if the AJAX call
// already finished
});
Andere Teile von jQuery verwenden ebenfalls verzögerte Objekte. Sie können jQuery-Animationen sehr einfach mit anderen asynchronen Vorgängen synchronisieren.
deferred objectsDing vorgestellt? Ich habe es noch nie gesehen. Außerdem scheint es etwas chaotisch zu sein, da sich der Code, der definiert, welcher Rückruf verwendet werden soll, an einem anderen Ort befindet als der eigentliche AJAX-Aufruf.