Après avoir lu des dizaines d’articles sur la qualité des promesses es6 et les raisons pour lesquelles nous devrions les mettre en œuvre, j’ai eu le sentiment que TOUTES mes fonctions javascript (non sortingviales) devraient être des promesses.
En fait, je me sens bien en écrivant du code de les utiliser, car j’évite le sortingangle de la catastrophe et semble obtenir un code clair et concis. (Cela rend le raisonnement sur l’exécution beaucoup plus simple).
Ce que je n’ai pas pu trouver, c’est: quand n’utilisez-vous pas les promesses? Quand dois-je éviter de les utiliser?
Mettre à jour:
Bien que j’aie vu de bons points comme la cohérence des API, je n’ai pas encore trouvé de cas solide. La réponse de Lux suggère que les opérations qui extraient des émetteurs d’événements devraient les éviter, car les rappels récurrents sont incompatibles avec les promesses. Cependant, j’ai l’impression que la réponse manque encore de substance pour la vérifier (comme correcte) pour le moment.
Quelques règles de base:
Lorsque votre méthode peut être synchrone (transformation de données simple), utilisez du code synchrone dans cette méthode.
Toutefois, si la méthode peut être parfois synchrone et parfois asynchrone (plusieurs chemins de code basés sur un état interne ou externe), elle doit toujours être asynchrone. Sinon, vous risquez de rencontrer des différences subtiles inattendues dans la façon dont votre code se comporte dans des scénarios complexes. Il est donc préférable d’éviter de mélanger les deux attitudes.
[edit] Comme indiqué dans le commentaire, lorsque votre méthode est synchrone pour le moment, mais que vous croyez qu’elle devra peut-être fonctionner asynchrone à un moment donné, vous souhaiterez peut-être utiliser les promesses dès le début pour éviter un refactoring coûteux.
En général, votre API doit être cohérente, il est donc préférable d’utiliser les promesses partout ou les rappels partout. Cela permettra de raisonner plus facilement sur le code.
Si vous écrivez du code ultra haute performance et / ou avez besoin d’une faible empreinte mémoire, vous pouvez envisager de ne pas utiliser de promesses mais de rappels, ou d’utiliser une bibliothèque de promesses axée sur les performances, telle que bluebird , au lieu de l’implémentation native Promise .
[modifier] Quoi qu’il en soit, les nouveaux ajouts à la plate-forme Web, tels que la fonction d’ extraction globale, renvoient une Promise
, et il semble qu’à l’avenir, de plus en plus de navigateurs intégrés fonctionneront sur des promesses. Donc, si vous êtes prêt à écrire du code moderne, vous n’échapperez pas aux promesses.
Vous utilisez des promesses pour des opérations asynchrones uniques. Lancer l’opération, effectuer l’opération, notifier un appelant de l’achèvement ou des résultats ou erreur et ensuite fait pour de bon.
Les situations dans lesquelles vous n’utilisez pas les promesses sont celles qui sont différentes de celles décrites ci-dessus:
Eh bien, les promesses ont un cas d’utilisation: des résultats asynchrones qui ne viennent qu’une fois.
Vous n’utilisez pas Promises si vous pouvez renvoyer le résultat en synchronisation, et vous avez toujours besoin de rappels d’événements, car ils peuvent se produire plusieurs fois.
Vous pouvez décider de ne pas utiliser Promises si vous souhaitez que votre code soit exécuté dans le navigateur (qui ne possède pas forcément Promises intégré) et que sa taille compte VRAIMENT ; vous ne pouvez donc pas vous permettre d’utiliser Promise shims / libs.
Le plus souvent, les promesses sont habituées à travailler avec aisance avec des tâches diverses. Parfois, nous faisons délibérément certaines choses pour être asynchrones afin d’éviter de surcharger le thread, avec lequel nous travaillons. Nous avons un seul fil par onglet. Nul besoin de faire des promesses quand il s’agit de choses petites ou pouvant être faites avec WebWorker.