Qu'est ce qui ne va pas avec ça?
Mais le modèle fonctionne!
Quel chanceux êtes-vous. Malheureusement, ce n'est probablement pas le cas, car vous avez probablement oublié un cas de bord. Dans plus de la moitié des cas que j'ai vus, l'auteur a oublié de prendre soin du gestionnaire d'erreurs:
return new Promise(function(resolve) {
getOtherPromise().then(function(result) {
resolve(result.property.example);
});
})
Si l'autre promesse est rejetée, cela se passera inaperçu au lieu d'être propagé à la nouvelle promesse (où elle serait gérée) - et la nouvelle promesse reste à jamais en attente, ce qui peut provoquer des fuites.
La même chose se produit dans le cas où votre code de rappel provoque une erreur - par exemple quand result
n'a pas de property
et une exception est levée. Cela ne serait pas géré et laisserait la nouvelle promesse non résolue.
En revanche, l'utilisation .then()
prend automatiquement en charge ces deux scénarios et rejette la nouvelle promesse lorsqu'une erreur se produit:
return getOtherPromise().then(function(result) {
return result.property.example;
})
L'antipattern différé est non seulement encombrant, mais également sujet aux erreurs . L'utilisation .then()
pour le chaînage est beaucoup plus sûre.
Mais j'ai tout géré!
Vraiment? Bien. Cependant, cela sera assez détaillé et copieux, surtout si vous utilisez une bibliothèque de promesses qui prend en charge d'autres fonctionnalités telles que l'annulation ou la transmission de messages. Ou peut-être le sera-t-il à l'avenir, ou vous voulez échanger votre bibliothèque contre une meilleure? Vous ne voudrez pas réécrire votre code pour cela.
Les méthodes des bibliothèques ( then
) ne supportent pas seulement nativement toutes les fonctionnalités, elles peuvent également avoir certaines optimisations en place. Leur utilisation rendra probablement votre code plus rapide, ou du moins permettra d'être optimisé par les futures révisions de la bibliothèque.
Comment l'éviter?
Donc, chaque fois que vous vous trouvez à créer manuellement une Promise
ou Deferred
des promesses déjà existantes, vérifiez d'abord l'API de la bibliothèque . L'antipattern différé est souvent appliqué par les personnes qui voient les promesses [uniquement] comme un modèle d'observation - mais les promesses sont plus que des rappels : elles sont censées être composables. Chaque bibliothèque décente a beaucoup de fonctions faciles à utiliser pour la composition des promesses de toutes les manières imaginables, en prenant soin de toutes les choses de bas niveau que vous ne voulez pas traiter.
Si vous avez trouvé un besoin de composer certaines promesses d'une manière nouvelle qui n'est pas prise en charge par une fonction d'assistance existante, l'écriture de votre propre fonction avec des différés inévitables devrait être votre dernière option. Pensez à passer à une bibliothèque plus fonctionnelle et / ou à déposer un bogue sur votre bibliothèque actuelle. Son responsable doit être en mesure de dériver la composition des fonctions existantes, d'implémenter une nouvelle fonction d'assistance pour vous et / ou d'aider à identifier les cas limites qui doivent être traités.
getStuffDone
wrapper de fonction et simplement utiliser le littéral Promise?