La "nouvelle" façon de faire cela depuis jQuery 1.5 (janvier 2011) est d'utiliser des objets différés au lieu de passer un success
rappel. Vous devez renvoyer le résultat de $.ajax
, puis utiliser les méthodes .done
, .fail
etc pour ajouter les rappels en dehors de l' $.ajax
appel .
function getData() {
return $.ajax({
url : 'example.com',
type: 'GET'
});
}
function handleData(data /* , textStatus, jqXHR */ ) {
alert(data);
//do some stuff
}
getData().done(handleData);
Cela dissocie la gestion des rappels de la gestion AJAX, vous permet d'ajouter plusieurs rappels, des rappels d'échec, etc., le tout sans jamais avoir besoin de modifier la getData()
fonction d' origine . Séparer la fonctionnalité AJAX de l'ensemble des actions à effectuer par la suite est une bonne chose! .
Les différés permettent également une synchronisation beaucoup plus facile de plusieurs événements asynchrones, ce que vous ne pouvez pas faire facilement avec success:
Par exemple, je pourrais ajouter plusieurs rappels, un gestionnaire d'erreurs et attendre qu'un minuteur s'écoule avant de continuer:
// 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
});
D'autres parties de jQuery utilisent également des objets différés - vous pouvez très facilement synchroniser les animations jQuery avec d'autres opérations asynchrones.
deferred objects
chose a-t-elle été présentée? Je ne l'ai jamais vu. De plus, cela semble un peu compliqué, car le code qui définit le rappel à utiliser se trouve dans un emplacement différent de l'appel AJAX réel.