quelle est la différence entre le succès et la méthode .done () de $ .ajax

102

Quelqu'un peut-il m'aider?
Je ne suis pas en mesure de comprendre la différence entre successet .done()de$.ajax .

Si possible, veuillez donner des exemples.

Poonam Bhatt
la source
où avez-vous lu une méthode done () de $ .ajax ()? AFAIK la méthode done est liée à l'objet $ .Deferred. Parlez-vous peut-être de .complete () à la place?
Fabrizio Calderan
1
sur la page api.jquery.com/jQuery.ajax
Poonam Bhatt
2
ok, c'est jQuery 1.8 :) Puisque $ .ajax retourne une promesse de jQuery 1.5 c'est une simple substitution pour une question de cohérence (en utilisant l'interface de deferred): done () prend la place de success (), fail () pour erreur () et toujours () pour complet ()
Fabrizio Calderan
2
Le vrai changement est que vous pouvez attacher plusieurs rappels par programme. Regardez la page de documentation $ .Deferred.
Fabrizio Calderan
1
Possible duplication de la gestion
BuZZ-dEE

Réponses:

8

En bref, découpler la fonction de rappel de succès de la fonction ajax afin que plus tard, vous puissiez ajouter vos propres gestionnaires sans modifier le code d'origine (modèle d'observateur).

Veuillez trouver des informations plus détaillées ici: https://stackoverflow.com/a/14754681/1049184

batbaatar
la source
1
Et en dessous, l'exemple cartographie l'équivalence de done => success, fail => error et always => complete
StuartLC
25
Cette réponse passe à côté de l'essentiel. Il existe une différence entre success: utilisé comme paramètre et .success()comme méthode sur un jqXHR. Ce dernier est obsolète, mais le premier est ce que le PO demandait.
Alnitak
2
Success / error / complete sont obsolètes et basés sur les changements d'état AJAX; done / fail / always sont basés sur les changements d'état différés de jQuery. Voir api.jquery.com/category/deferred-object .
mickeyreiss
28
Je ne peux pas croire qu'une réponse qui interprète mal la question est à la fois la solution la plus votée et la solution acceptée ...
Transcendance
108

successse déclenche uniquement si l'appel AJAX réussit, c'est-à-dire renvoie finalement un état HTTP 200. errorse déclenche en cas d'échec etcomplete lorsque la demande se termine, quel que soit le succès.

Dans jQuery 1.8 sur l' jqXHRobjet (retourné par $.ajax) a successété remplacé par done, errorpar failet completepar always.

Cependant, vous devriez toujours pouvoir initialiser la requête AJAX avec l'ancienne syntaxe. Donc, ceux-ci font des choses similaires:

// set success action before making the request
$.ajax({
  url: '...',
  success: function(){
    alert('AJAX successful');
  }
});

// set success action just after starting the request
var jqxhr = $.ajax( "..." )
  .done(function() { alert("success"); });

Cette modification concerne la compatibilité avec l' objet différé de jQuery 1.5 . Différé (et maintenant Promise, qui a une prise en charge complète du navigateur natif dans Chrome et FX) vous permet d'enchaîner des actions asynchrones:

$.ajax("parent").
    done(function(p) { return $.ajax("child/" + p.id); }).
    done(someOtherDeferredFunction).
    done(function(c) { alert("success: " + c.name); });

Cette chaîne de fonctions est plus facile à maintenir qu'une pyramide imbriquée de rappels que vous obtenez success.

Cependant, veuillez noter que donec'est désormais obsolète au profit de la Promisesyntaxe qui utilise à la thenplace:

$.ajax("parent").
    then(function(p) { return $.ajax("child/" + p.id); }).
    then(someOtherDeferredFunction).
    then(function(c) { alert("success: " + c.name); }).
    catch(function(err) { alert("error: " + err.message); });

Cela vaut la peine d'être adopté car asyncet awaitétendre promet une syntaxe améliorée (et une gestion des erreurs):

try {
    var p = await $.ajax("parent");
    var x = await $.ajax("child/" + p.id);
    var c = await someOtherDeferredFunction(x);
    alert("success: " + c.name);
}
catch(err) { 
    alert("error: " + err.message); 
}
Keith
la source
création de fonction avant de faire la demande, et définir la fonction après avoir fait la demande. On dirait que les deux sont identiques ... me montreras-tu d'autres différences ???
suhailvs
@suhail - il n'y en a pas vraiment; dans jQuery 1.6 il y avait success, dans jQuery 1.8 qui a été remplacé par done. Ils fonctionnent de la même manière, mais donesont plus cohérents avec le reste de jQuery.
Keith
@Keith donc aujourd'hui, utiliser .done équivaut à utiliser le succès? ou il y a autre chose encore plus récent?
Roxy'Pro
@ Roxy'Pro c'était obsolète quand j'y ai répondu, je n'utiliserais certainement pas cela en 2018. .doneC'était le premier coup (et maintenant l'impasse) de jQuery à ce qui est devenu Promiseet qui a maintenant un support linguistique assez complet. Dans de nouveaux projets, j'utiliserais à la const response = await fetch(...)place.
Keith
6

.success() n'est appelé que si votre serveur Web répond avec un en-tête HTTP 200 OK - essentiellement quand tout va bien.

Les rappels attachés à done () seront déclenchés lorsque le différé est résolu. Les rappels attachés à fail () seront déclenchés lorsque le différé est rejeté.

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback
Sameera Thilakasiri
la source
3
Il convient de noter que .success () n'est PAS appelé lorsque JSON malformé est renvoyé avec un code d'état 200 / OK. Plus précisément, j'ai rencontré un problème avec le code backend du serveur Web générant des valeurs NaN et les sérialisant en tant que javascript NaN (c'est-à-dire en tant que symbole, et non en tant que chaîne 'NaN') qui n'est en fait pas valide JSON - donc l'analyse de la réponse en JSON échoue et .fail () est exécuté, mais l'état de la réponse est 200. Mais il est toujours vrai que le succès est UNIQUEMENT appelé avec un code d'état OK; Je voulais juste souligner que ce n'est pas parce que c'est OK que ça veut dire que c'est `` réussi '';)
Kasapo
1

successest le rappel qui est appelé lorsque la demande aboutit et fait partie de l' $.ajaxappel. donefait en fait partie de l' jqXHRobjet renvoyé par $.ajax()et remplace successdans jQuery 1.8.

devdigital
la source