success
a été le nom traditionnel du rappel de réussite dans jQuery, défini comme une option dans l'appel ajax. Cependant, depuis l'implémentation de $.Deferreds
rappels plus sophistiqués, done
c'est le moyen préféré pour implémenter des rappels réussis, car il peut être appelé sur n'importe quel deferred
.
Par exemple, le succès:
$.ajax({
url: '/',
success: function(data) {}
});
Par exemple, fait:
$.ajax({url: '/'}).done(function(data) {});
Ce qui est bien, done
c'est que la valeur de retour de $.ajax
est désormais une promesse différée qui peut être liée à n'importe où ailleurs dans votre application. Supposons donc que vous souhaitiez effectuer cet appel ajax à partir de plusieurs endroits différents. Plutôt que de passer dans votre fonction de succès en option à la fonction qui rend cet appel ajax, vous pouvez juste avoir le retour de la fonction $.ajax
elle - même et se lient vos callbacks avec done
, fail
, then
ou autre chose. Notez qu'il always
s'agit d'un rappel qui s'exécutera si la demande réussit ou échoue. done
ne sera déclenché qu'en cas de succès.
Par exemple:
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
});
Un avantage important de ceci en termes de maintenabilité est que vous avez enveloppé votre mécanisme ajax dans une fonction spécifique à l'application. Si vous décidez que votre $.ajax
appel devra fonctionner différemment à l'avenir, ou si vous utilisez une méthode ajax différente, ou si vous vous éloignez de jQuery, vous n'avez qu'à modifier la xhr_get
définition (en étant sûr de renvoyer une promesse ou au moins une done
méthode, dans le cas de l'exemple ci-dessus). Toutes les autres références dans l'application peuvent rester les mêmes.
Il y a beaucoup plus (beaucoup plus cool) de choses que vous pouvez faire $.Deferred
, dont l'une consiste pipe
à déclencher une défaillance sur une erreur signalée par le serveur, même lorsque la $.ajax
demande elle-même réussit. Par exemple:
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
});
En savoir plus sur $.Deferred
ici: http://api.jquery.com/category/deferred-object/
REMARQUE : à partir de jQuery 1.8, pipe
a été déconseillé au profit de l'utilisation then
exactement de la même manière.
success:
/.done()
sont définies, le cas échéant. Par exemple, estsuccess:
juste mis en œuvre comme le premier.done()
ces jours-ci?success:
et.done
un appel ajax? Bonne question. Étant donné que tous les autres rappels sont appelés dans l'ordre dans lequel ils sont liés, je suppose que oui,success
est simplement appelé en premier.pipe
est celui où la demande elle-même réussit mais le script sur le serveur n'a pas retourné ce que vous cherchiez. Vous ne voudrez peut-être pas jeter un 404 ou 500 réel ou autre côté serveur, car vous voulez faire une distinction significative entre les réponses http et les réponses des applications. La définition d'un code de réponse dans le JSON, puis l'utilisation depipe
cette manière vous permet de gérer différents types d'erreurs avec plus de nuances.Si vous
async: false
en avez besoin dans votre ajax, vous devez utiliser à lasuccess
place de.done
. Sinon, il vaut mieux utiliser.done
. C'est du site officiel de jQuery :la source
async:false
?$.ajax({ url: req_url, ..., async: false, success: function (result, status, req) { }, error: function (jqXHR, status) { } });
Les objets jqXHR renvoyés par
$.ajax()
jQuery 1.5 implémentent l'interface Promise, en leur donnant toutes les propriétés, méthodes et comportement d'une promesse (voir Objet Deferred pour plus d'informations). Ces méthodes prennent un ou plusieurs arguments de fonction qui sont appelés lorsque la$.ajax()
demande se termine. Cela vous permet d'affecter plusieurs rappels sur une seule demande, et même d'attribuer des rappels une fois la demande terminée. (Si la demande est déjà terminée, le rappel est déclenché immédiatement.) Les méthodes Promise disponibles de l'objet jqXHR incluent:Une construction alternative à l'option de rappel de réussite, reportez-vous à
deferred.done()
pour les détails d'implémentation.Une construction alternative à l'option de rappel d'erreur, la
.fail()
méthode remplace la méthode .error () obsolète. Reportez-vous à deferred.fail () pour les détails d'implémentation.(ajouté dans jQuery 1.6) Une construction alternative à l'option de rappel complet, la
.always()
méthode remplace la.complete()
méthode déconseillée .En réponse à une requête réussie, les arguments de la fonction sont les mêmes que ceux de
.done()
: data, textStatus et l'objet jqXHR. Pour les requêtes ayant échoué, les arguments sont les mêmes que ceux de.fail()
: l'objet jqXHR, textStatus et errorThrown. Reportez-vous àdeferred.always()
pour les détails d'implémentation.Intègre la fonctionnalité des méthodes
.done()
et.fail()
, permettant (à partir de jQuery 1.8) de manipuler la promesse sous-jacente. Reportez-vous à différé.then()
pour les détails de mise en œuvre.la source