Le chaînage de plusieurs done() rappels à la même promesse différée
En bref, je voudrais avoir un callback qui est toujours utilisé en cas de réussite d'un appel ajax, suivie par une fonctionnalité de rappel selon l'endroit où la méthode est invoquée.
Cela semble fonctionner. Ma question est de savoir si c'est un usage correct de la promesse de l'objet et si il est sûr de supposer que les multiples promesses de rappels du même type, toujours pile de façon séquentielle?
var dfd = $.Deferred(),
promise = dfd.promise();
promise.done(function(){
console.log(1);
}).done(function(){
console.log(2);
});
dfd.resolve();
Vous devez vous connecter pour publier un commentaire.
C'est correct et l'utilisation documentée de report de l'objet jQuery. La documentation clairement états:
Il fonctionne différemment dans les autres promesse de bibliothèques et plus généralement
.then
est préféré à.done
de toute façon (expliqué plus loin dans la réponse). Cependant, étant donné que vous êtes à l'aide de jQuery promesses, il va pile de l'amende juste séquentiellement si ils sont synchrones.Donc la réponse directe à votre question est oui.
Cependant, vous pouvez aussi le faire avec asynchrone code et de le chaîne de mieux avec
.then
:Fondamentalement,
done
ajoute un gestionnaire et retourne la même promesse et.then
retourne une nouvelle promesse enchaînés à partir de la dernière. En général, je ne pourrais que l'utilisation.done
pour mettre fin à des chaînes et si vous voulez conserver la valeur de retour (l'argument de lafunction(){
)generally .then is preferred to .done anyway
je suppose que vous vous référez à l'enchaînement, et pasdone
vsthen
en général? Je suppose que l'approche la plus appropriée en fonction de votre commentaire serait d'utiliserthen()
suivie par une "terminaison"done()
, même si je suis le seul à traiter avec code synchrone dans ce cas?then
àdone
lors de l'utilisation de nouvelles promesses bibliothèques. En jQuery sur l'autre main à l'aide d'.done
pour mettre fin à la chaîne est bénéfique - si oui, puis, de nouveau, ce n'est pas le plus gros problème avec jQuery promesses.then()
appelle ainsi. (en attente avec mon upvote jusqu'à ce que cela est précisé 🙂.done
prend un callback et retourne la même promesse. Dans d'autres bibliothèques comme Q et Bluebird.done
ne pas prendre quoi que ce soit et ne retourne rien. En jQuery, il est utilisé pour la chaîne de gestionnaires au résultat - dans d'autres bibliothèques dans met fin à la promesse de la chaîne et des journaux non gérées rejets - jQuery n'est pas vraiment gérer les rejets et dans ses promesses. C'est ce que je voulais dire, je suppose.done
fonctionne différemment", pas "la séquence est différente".