Après que Node.js ait ajouté le support natif pour les promesses, y a-t-il encore des raisons d'utiliser des bibliothèques comme Q ou BlueBird?
Par exemple, si vous démarrez un nouveau projet et supposons que dans ce projet vous n'avez pas de dépendances qui utilisent ces bibliothèques, pouvons-nous dire qu'il n'y a vraiment plus de raisons d'utiliser de telles bibliothèques?
Réponses:
Le vieil adage veut que vous devez choisir le bon outil pour le travail. Les promesses d'ES6 fournissent les bases. Si tout ce que vous voulez ou avez besoin est les bases, alors cela devrait / pourrait fonctionner très bien pour vous. Mais, il y a plus d'outils dans la boîte à outils que les bases et il y a des situations où ces outils supplémentaires sont très utiles. Et, je dirais que les promesses ES6 manquent même certaines des bases comme la promisification qui sont utiles dans à peu près tous les projets node.js.
Je connais le mieux la bibliothèque de promesses Bluebird , je parlerai donc principalement de mon expérience avec cette bibliothèque.
Voici donc mes 6 principales raisons d'utiliser une bibliothèque Promise plus performante
Interfaces asynchrones non promises -
.promisify()
et.promisifyAll()
sont incroyablement utiles pour gérer toutes ces interfaces asynchrones qui nécessitent toujours des rappels simples et ne renvoient pas encore de promesses - une ligne de code crée une version promise de toute une interface.Plus rapide - Bluebird est nettement plus rapide que les promesses natives dans la plupart des environnements.
Séquençage de l'itération du tableau asynchrone -
Promise.mapSeries()
ouPromise.reduce()
vous permet de parcourir un tableau, en appelant une opération asynchrone sur chaque élément, mais en séquençant les opérations asynchrones de sorte qu'elles se produisent l'une après l'autre, pas toutes en même temps. Vous pouvez le faire soit parce que le serveur de destination l'exige, soit parce que vous devez passer un résultat au suivant.Polyfill - Si vous souhaitez utiliser des promesses dans les anciennes versions des clients de navigateur, vous aurez quand même besoin d'un polyfill. Peut aussi bien obtenir un polyfill capable. Étant donné que node.js a des promesses ES6, vous n'avez pas besoin d'un polyfill dans node.js, mais vous pouvez le faire dans un navigateur. Si vous codez à la fois le serveur et le client node.js, il peut être très utile d'avoir la même bibliothèque de promesses et les mêmes fonctionnalités dans les deux (plus facile à partager du code, changement de contexte entre les environnements, utiliser des techniques de codage communes pour le code asynchrone, etc.) .).
Autres fonctions - Bluebird a
Promise.map()
,Promise.some()
,Promise.any()
,Promise.filter()
,Promise.each()
etPromise.props()
tous qui sont parfois à portée de main. Bien que ces opérations puissent être effectuées avec des promesses ES6 et du code supplémentaire, Bluebird est livré avec ces opérations déjà pré-construites et pré-testées, il est donc plus simple et moins de code de les utiliser.Avertissements intégrés et traces de pile complètes - Bluebird a un certain nombre d'avertissements intégrés qui vous avertissent de problèmes qui sont probablement du mauvais code ou un bogue. Par exemple, si vous appelez une fonction qui crée une nouvelle promesse à l'intérieur d'un
.then()
gestionnaire sans renvoyer cette promesse (pour la lier à la chaîne de promesses actuelle), alors dans la plupart des cas, il s'agit d'un bogue accidentel et Bluebird vous en avertira effet. D'autres avertissements Bluebird intégrés sont décrits ici .Voici quelques détails supplémentaires sur ces différents sujets:
PromisifyAll
Dans tout projet node.js, j'utilise immédiatement Bluebird partout car j'utilise
.promisifyAll()
beaucoup de modules node.js standard comme lefs
module.Node.js ne fournit pas lui-même une interface de promesse aux modules intégrés qui font des E / S asynchrones comme le
fs
module. Donc, si vous souhaitez utiliser des promesses avec ces interfaces, vous devez soit coder manuellement un wrapper de promesse autour de chaque fonction de module que vous utilisez, soit obtenir une bibliothèque qui peut le faire pour vous ou ne pas utiliser de promesses.Bluebird
Promise.promisify()
etPromise.promisifyAll()
fournir un habillage automatique de node.js appelant les API asynchrones de convention pour retourner les promesses. C'est extrêmement utile et fait gagner du temps. Je l'utilise tout le temps.Voici un exemple de comment cela fonctionne:
L'alternative serait de créer manuellement votre propre wrapper de promesse pour chaque
fs
API que vous souhaitez utiliser:Et, vous devez le faire manuellement pour chaque fonction API que vous souhaitez utiliser. Cela n'a clairement aucun sens. C'est le code passe-partout. Vous pourriez aussi bien obtenir un utilitaire qui fait ce travail pour vous. Bluebird
Promise.promisify()
etPromise.promisifyAll()
sont un tel utilitaire.Autres fonctionnalités utiles
Voici quelques-unes des fonctionnalités de Bluebird que je trouve particulièrement utiles (il y a quelques exemples de code ci-dessous sur la façon dont ceux-ci peuvent enregistrer du code ou accélérer le développement):
En plus de sa fonction utile,
Promise.map()
prend également en charge une option de concurrence qui vous permet de spécifier le nombre d'opérations qui doivent être autorisées à s'exécuter en même temps, ce qui est particulièrement utile lorsque vous avez beaucoup de choses à faire, mais ne pouvez pas en submerger certaines à l'extérieur Ressource.Certains d'entre eux peuvent être à la fois appelés autonomes et utilisés sur une promesse qui se résout en un itérable qui peut économiser beaucoup de code.
Polyfill
Dans un projet de navigateur, étant donné que vous souhaitez généralement prendre en charge certains navigateurs qui ne prennent pas en charge Promise, vous finissez par avoir besoin d'un polyfill de toute façon. Si vous utilisez également jQuery, vous pouvez parfois simplement utiliser le support de promesse intégré à jQuery (bien qu'il soit douloureusement non standard à certains égards, peut-être corrigé dans jQuery 3.0), mais si le projet implique une activité asynchrone importante, je trouve les fonctionnalités étendues de Bluebird sont très utiles.
plus rapide
Il convient également de noter que les promesses de Bluebird semblent être beaucoup plus rapides que les promesses intégrées au V8. Voir cet article pour plus de discussion sur ce sujet.
Une grosse chose Node.js est manquante
Ce qui me ferait envisager d'utiliser moins Bluebird dans le développement de node.js serait si node.js a intégré une fonction promisify pour que vous puissiez faire quelque chose comme ceci:
Ou offrez simplement des méthodes déjà promises dans le cadre des modules intégrés.
Jusque-là, je fais ça avec Bluebird:
Il semble un peu étrange que le support des promesses ES6 soit intégré dans node.js et qu'aucun des modules intégrés ne renvoie de promesses. Cela doit être trié dans node.js. D'ici là, j'utilise Bluebird pour promettre des bibliothèques entières. Ainsi, il semble que les promesses soient implémentées à environ 20% dans node.js maintenant, car aucun des modules intégrés ne vous permet d'utiliser des promesses avec elles sans les envelopper manuellement au préalable.
Exemples
Voici un exemple de promesses simples par rapport à la promesse de Bluebird et
Promise.map()
pour la lecture d'un ensemble de fichiers en parallèle et la notification lorsque vous avez terminé avec toutes les données:Des promesses simples
Bluebird
Promise.map()
etPromise.promisifyAll()
Voici un exemple de promesses simples par rapport à la promesse de Bluebird et
Promise.map()
lors de la lecture d'un tas d'URL à partir d'un hôte distant où vous pouvez lire au plus 4 à la fois, mais souhaitez conserver autant de demandes en parallèle que possible:Plain JS Promises
Promesses Bluebird
la source
return new Promise(function(resolve, rejct)
. Devrait être:reject
util.promisify
maintenant, bien qu'il n'y ait pas d'promisifyAll
équivalent direct .fs
, mais encore d'autres raisons d'utiliser Bluebird (mon préféré est l'concurrency
option enPromise.map()
) pour éviter de submerger un service cible auquel vous devez faire un tas de demandes parallèles. De plus, il y a encore beaucoup d'autres interfaces non promises pour utiliser promisifyAll de Bluebird. Mais, lentement, les raisons de saisir immédiatement Bluebird dans chaque nouveau projet s'effacent alors que node.js lui-même renforce son support de promesse intégré.