107 votes

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

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

Si possible, veuillez donner des exemples.

0 votes

Où avez-vous lu que la méthode done() de $.ajax() existait ? Je pense que la méthode done est liée à l'objet $.Deferred. Peut-être parlez-vous plutôt de .complete() ?

1 votes

2 votes

Ok, c'est jQuery 1.8 :) Puisque $.ajax retourne une promesse depuis jQuery 1.5, il s'agit d'une simple substitution pour une question de cohérence (en utilisant l'interface de deferred) : done() prend la place de success(), fail() pour error() et always() pour complete()

114voto

Keith Points 46288

success ne se déclenche que si l'appel AJAX est réussi, c'est-à-dire s'il renvoie finalement un statut HTTP 200. error se déclenche s'il échoue et complete lorsque la demande est terminée, quel que soit le succès.

Dans la version 1.8 de jQuery, sur la page jqXHR (retourné par $.ajax ) success a été remplacé par done , error con fail y complete con always .

Cependant, vous devriez toujours être en mesure d'initialiser la requête AJAX avec l'ancienne syntaxe. Elles font donc 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 a pour but d'assurer la compatibilité avec la version 1.5 de jQuery. objet différé . Reporté (et maintenant Promise (qui bénéficie d'une prise en charge native complète dans les navigateurs Chrome et FX) vous permettent 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 callbacks que l'on obtient avec la fonction success .

Toutefois, veuillez noter que done est désormais déprécié au profit de l'option Promise qui utilise la syntaxe then à la place :

$.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 async y await extend promet une syntaxe (et une gestion des erreurs) améliorée :

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); 
}

0 votes

Création de la fonction avant de faire la demande, et définition de la fonction après avoir fait la demande. Il semble que les deux soient identiques ... pouvez-vous me montrer d'autres différences ???

1 votes

@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 done est plus cohérent avec le reste de jQuery.

0 votes

@Keith donc aujourd'hui, utiliser .done est la même chose qu'utiliser success ? ou il y a quelque chose d'encore plus récent ?

6voto

batbaatar Points 3088

En bref, découpler la fonction de rappel du succès de la fonction ajax afin de pouvoir ajouter ultérieurement vos propres gestionnaires sans modifier le code original (modèle d'observateur).

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

1 votes

En dessous, l'exemple montre l'équivalence entre done => succès, fail => erreur et always => complet.

25 votes

Cette réponse ne répond pas à la question. Il y a une différence entre success: utilisé comme paramètre et .success() comme une méthode sur un jqXHR . Ce dernier est en train d'être déprécié, mais le premier est ce que le PO demandait.

2 votes

Success/error/complete sont dépréciés et basés sur les changements d'état AJAX ; done/fail/always sont basés sur les changements d'état jQuery Deferred. Voir api.jquery.com/category/deferred-object .

6voto

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

Les callbacks attachés à done() seront déclenchés lorsque le différé sera résolu. Les callbacks 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

5 votes

Il convient de noter que .success() n'est PAS appelé lorsque du 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 qui générait des valeurs NaN et les sérialisait en tant que javascript NaN (c'est-à-dire en tant que symbole, et non en tant que chaîne 'NaN'), ce qui n'est en fait pas du JSON valide -- donc l'analyse de la réponse en tant que JSON échoue et .fail() est exécuté, mais le statut de la réponse est 200. Mais il est toujours vrai que le succès est appelé UNIQUEMENT avec un code d'état OK ; je voulais juste souligner que ce n'est pas parce que c'est OK que c'est un succès ;)

1voto

devdigital Points 22495

success est la fonction de rappel qui est invoquée lorsque la demande est réussie et fait partie de l'environnement de l'utilisateur. $.ajax appeler. done fait en fait partie de la jqXHR retourné par $.ajax() et remplace success dans jQuery 1.8.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X