Quand NE PAS utiliser les promesses

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:

  1. 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.

  2. 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.

  3. 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 .

  4. [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:

  1. Lorsque votre opération ou fonction est entièrement synchrone . Le fait de mettre une API asynchrone (même avec des promesses) sur une opération synchrone rend les choses plus complexes que nécessaire.
  2. Au lieu d’événements pouvant se produire plusieurs fois. Par exemple, vous ne voudriez pas utiliser une promesse pour un gestionnaire de clic sur un bouton. Un eventEmitter ou une autre structure semblable à un événement rest une meilleure structure pour les événements récurrents.
  3. Lorsque vous vous trouvez dans une situation de rappel où le rappel est conçu pour être appelé à plusieurs resockets (par exemple, pour signaler la progression ou fournir un service de plug-in via le rappel).
  4. Si vous ajoutez une nouvelle opération à une API déjà conçue d’une autre manière (par exemple, avec des rappels traditionnels), la cohérence de l’API est souhaitée.
  5. Si vous ciblez des environnements plus anciens qui ne prennent pas nativement en charge Promises (comme les anciens navigateurs) et que vous essayez d’optimiser la taille de téléchargement de votre code et que vous n’effectuez qu’une ou deux opérations asynchrones sans utiliser quelque chose comme jQuery ou Angular qui a déjà une forme de promesse intégrée que vous pouvez simplement utiliser. Si vous effectuez une quantité importante de travail asynchrone, il vaut probablement la peine d’utiliser un Polyfill Promises. Ce point ne concerne que les cas où la taille est extrêmement importante et où il y a très peu de travail asynchrone.
  6. Pour les situations où souvent l’action ne se termine pas ou ne se produit pas . Les promesses sont un object avec un état et consumnt donc un peu de mémoire. Il ne serait pas logique de créer des milliers de promesses pour être averti d’un grand nombre de choses différentes qui ne se produiront généralement pas, car cela créerait des milliers d’objects prometteurs (généralement accompagnés de leurs fermetures) qui ne seraient généralement jamais utilisés. Ceci est simplement une utilisation inefficace de la mémoire et probablement mieux servie par une sorte de notification d’événement. Comme je l’ai dit plus haut, les promesses donnent de meilleurs résultats lorsque vous lancez une opération, effectuez l’opération, informez l’appelant des résultats ou de l’erreur.

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.