Il "nuovo" modo di farlo a partire da jQuery 1.5 (gennaio 2011) consiste nell'utilizzare gli oggetti posticipati anziché passare una richiamata success
. Si dovrebbe tornare il risultato di $.ajax
e quindi utilizzare i .done
, .fail
ecc metodi per aggiungere i callback al di fuori della chiamata $.ajax
.
function getData() {
return $.ajax({
url : 'example.com',
type: 'GET'
});
}
function handleData(data /* , textStatus, jqXHR */) {
alert(data);
//do some stuff
}
getData().done(handleData);
Questo disaccoppia la gestione della movimentazione AJAX callback, permette di aggiungere più callback, callback fallimento, ecc, il tutto senza mai dover modificare la funzione originale getData()
.Separare la funzionalità AJAX dal set di azioni da completare successivamente è una buona cosa!.
Deferreds anche consentire molto più facile la sincronizzazione di più eventi asincroni, che non si può facilmente fare proprio con success:
Per esempio, potrei aggiungere più funzioni di callback, un gestore di errori, e attendere un timer che trascorra prima di continuare:
// 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
});
altre parti del jQuery utilizzano oggetti anticipate troppo - è possibile sincronizzare le animazioni jQuery con altre operazioni asincrone molto facilmente con loro.
passando 'callback Success' è _so_ 2010 ... – Alnitak
@Alnitak, quando ha fatto la cosa' differita objects' avere introdotto? Non l'ho visto prima. Inoltre, sembra leggermente disordinato, dal momento che il codice che definisce quale callback utilizzare è in una posizione diversa rispetto alla chiamata AJAX effettiva. – Cerbrus
è stato introdotto in jQuery 1.5 ed è _far_ meno disordinato di usare 'success:'. Disaccoppiare il callback da AJAX è una cosa buona! Vedi le note che ho appena aggiunto alla fine della mia risposta. – Alnitak