Bluebird NPM : promesse Bluebird JS avec exemple

โšก Rรฉsumรฉ intelligent

Bluebird JS est une bibliothรจque de promesses complรจte pour JavaScript dont la principale caractรฉristique est la promisification : convertir des modules Node basรฉs sur des rappels en modules renvoyant des promesses, de sorte quโ€™une bibliothรจque entiรจre telle que MongoDB Le pilote peut รชtre utilisรฉ de maniรจre asynchrone.

  • ???? Capacitรฉ principale : La fonction promisifyAll encapsule chaque mรฉthode d'un module en ajoutant le suffixe Async qui indique que la mรฉthode renvoie dรฉsormais une promesse.
  • ๐Ÿ“ฆ Installation: Une simple commande npm install bluebird ajoute la bibliothรจque, aprรจs quoi require expose l'objet Promise.
  • ๐Ÿ”— Enchaรฎnement : Chacune reรงoit alors la valeur de rรฉsolution prรฉcรฉdente, ce qui remplace les rappels imbriquรฉs par une sรฉquence d'รฉtapes plate.
  • ๐Ÿท๏ธ Rรจgle de dรฉnomination : Seules les variantes avec le suffixe Async renvoient des promesses ; les mรฉthodes de rappel dโ€™origine restent inchangรฉes.
  • ๐Ÿ›ก๏ธ Chemin d'รฉchec : Un seul point de capture ร  la fin d'une chaรฎne reรงoit les rejets de chaque รฉtape prรฉcรฉdente.
  • ๏ธ Contexte moderne : Les promesses natives et l'attente asynchrone couvrent dรฉsormais la plupart des fonctionnalitรฉs autrefois exclusives de Bluebird.

Promesses Bluebird JS

Quโ€™est-ce que Bluebird JS ?

Bluebird JS est une bibliothรจque de promesses complรจte pour JavaCe script a pour principal atout la possibilitรฉ de ยซ promisifier ยป d'autres modules Node afin de les utiliser de maniรจre asynchrone. La promesse est un concept appliquรฉ aux fonctions de rappel, garantissant que chaque fonction de rappel appelรฉe renvoie une valeur.

Donc si un Node.js Le module contient une fonction de rappel qui ne renvoie pas de valeur, ce qui implique que le module modifie automatiquement toutes ses fonctions afin que chacune renvoie une valeur.

Cela signifie que vous pouvez utiliser Bluebird pour fabriquer le MongoDB Le module s'exรฉcute de maniรจre asynchrone, ce qui simplifie encore davantage le dรฉveloppement d'applications Node.js.

L'exemple ci-dessous รฉtablit d'abord une connexion ร  la collection ยซ Employee ยป de la base de donnรฉes ยซ EmployeeDB ยป. Une fois la connexion รฉtablie, il rรฉcupรจre tous les enregistrements de la collection et les affiche dans la console.

Comment gรฉnรฉrer des promesses avec la bibliothรจque Bluebird JS

Voici un exemple รฉtape par รฉtape montrant comment gรฉnรฉrer des promesses avec la bibliothรจque JS Bluebird.

ร‰tape 1) Installation des modules NPM

Pour utiliser Bluebird dans une application Node, le module Bluebird est requis. Installez-le avec la commande ci-dessous :

npm install bluebird

ร‰tape 2) Inclure le module Bluebird

L'รฉtape suivante consiste ร  inclure le module Bluebird dans votre code et ร  convertir l'ensemble en promesse. MongoDB module. Promettre ici signifie que Bluebird garantit que chaque mรฉthode dรฉfinie dans le module MongoDB la bibliothรจque renvoie une promesse.

Inclure les modules Bluebird

Code Explication:

  1. Le require Cette commande inclut la bibliothรจque Bluebird.
  2. Le merlebleu .promisifyAll() Cette mรฉthode crรฉe une version asynchrone de chaque mรฉthode. MongoDB Ce module fournit des fonctions qui s'exรฉcutent en arriรจre-plan et renvoient une promesse.

ร‰tape 3) Se connecter ร  la base de donnรฉes

La derniรจre รฉtape consiste ร  se connecter ร  la base de donnรฉes, ร  rรฉcupรฉrer tous les enregistrements de la collection et ร  les afficher dans la console.

Se connecter ร  la base de donnรฉes

Code Explication:

  1. Notez le connectAsync La mรฉthode est utilisรฉe ร  la place de la mรฉthode normale connect mรฉthode. Bluebird ajoute le Async suffixe ร  chaque mรฉthode dans le MongoDB Cette bibliothรจque permet de distinguer les appels qui renvoient des promesses de ceux qui n'en renvoient pas. Les mรฉthodes sans le suffixe Async n'offrent aucune garantie de ce type.
  2. Similaire ร  connectAsync, le findAsync la mรฉthode renvoie tous les enregistrements dans le MongoDB Collection ยซ Employรฉ ยป.
  3. If findAsync Une fois la rรฉsolution rรฉussie, le bloc suivant parcourt chaque enregistrement de la collection et l'affiche dans la console.

Si les รฉtapes ci-dessus sont correctement effectuรฉes, tous les documents de la collection Employรฉ s'affichent dans la console, comme indiquรฉ dans le rรฉsultat ci-dessous.

Bluebird promet un rรฉsultat

Voici le code complet pour rรฉfรฉrence :

var Promise = require('bluebird');

// promisifyAll adds an Async variant of every MongoDB method
var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient;

mongoClient.connectAsync('mongodb://localhost/EmployeeDB')

    .then(function(db) {
        return db.collection('Employee').findAsync({});
    })
    .then(function(cursor) {
        cursor.each(function(err, doc) {
            console.log(doc);
        });
    });

โš ๏ธ Note concernant la version du pilote : Le code ci-dessus cible MongoDB Pilote Node 2.x, oรน connect se rรฉsout avec un objet de base de donnรฉes. ร€ partir du pilote 3.0 ร  partir de maintenant il se rรฉsout avec un MongoClient, la chaรฎne doit donc appeler client.db('EmployeeDB').collection('Employee') au lieu de db.collection('Employee')Les versions modernes des pilotes renvoient dรฉjร  des promesses natives, ce qui rend promisifyAll inutile pour MongoDB Plus prรฉcisรฉment.

Bluebird ou Native Promises : lequel utiliser ?

Lors de sa premiรจre conception, Bluebird ne prenait pas en charge les promesses dans Node.js ; la bibliothรจque comblait donc une vรฉritable lacune de la plateforme. Node.js intรจgre les promesses natives depuis la version 4. async/await Depuis la version 7.6, ce qui modifie considรฉrablement le calcul pour toute personne dรฉmarrant un projet aujourd'hui.

Aspect Bluebird Promesses autochtones
Dรฉpendance Un package npm ร  installer et ร  maintenir Intรฉgrรฉ ร  l'environnement d'exรฉcution
Des rappels prometteurs promisifyAll() convertit un module entier util.promisify() convertit une fonction
Aides supplรฉmentaires carte, filtre, propriรฉtรฉs, chaque, dรฉlai d'expiration, annulation tous, tous rรฉglรฉs, n'importe quelle race seulement
Pile longue traces Oui, lorsqu'il est activรฉ Amรฉliorรฉ mais plus court
Meilleur pour Bibliothรจques de rappel hรฉritรฉes, outils d'aide ร  la concurrence Nouveau code, et tout ce qui utilise async await

Pour les nouveaux dรฉveloppements, privilรฉgiez les promesses natives, car elles ne nรฉcessitent aucune dรฉpendance et s'intรจgrent directement avec `async/await`. Utilisez Bluebird lorsqu'une dรฉpendance n'expose que des fonctions de rappel, ou lorsque ses outils de gestion de la concurrence, tels queโ€ฆ Promise.map Avec une limite de concurrence, รฉconomisez une quantitรฉ significative de code.

Comment gรฉrer les erreurs avec les promesses Bluebird

L'exemple ci-dessus ne comporte aucun chemin d'รฉchec. Si MongoDB Si la chaรฎne de promesses ne s'exรฉcute pas ou si le nom de la collection est incorrect, elle est rejetรฉe et aucun affichage n'est effectuรฉ : le processus se termine simplement sans explication. Chaque chaรฎne de promesses nรฉcessite un gestionnaire de fin de chaรฎne.

Bluebird soutient .catch() pour les rejets et .finally() pour le nettoyage qui doit รชtre exรฉcutรฉ dans tous les cas. Il prend รฉgalement en charge les blocs catch typรฉs, qui gรจrent une classe d'erreurs tout en laissant les autres se propager.

var Promise = require('bluebird');
var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient;

var connection;

mongoClient.connectAsync('mongodb://localhost/EmployeeDB')
    .then(function(db) {
        connection = db;
        return db.collection('Employee').findAsync({});
    })
    .then(function(cursor) {
        return cursor.toArrayAsync();
    })
    .then(function(docs) {
        docs.forEach(function(doc) { console.log(doc); });
    })
    .catch(Promise.TimeoutError, function(err) {
        console.error('The database did not respond in time.');
    })
    .catch(function(err) {
        // Any other rejection from any step above arrives here
        console.error('Query failed:', err.message);
    })
    .finally(function() {
        // Runs on success and on failure, so the socket always closes
        if (connection) { connection.close(); }
    });

Trois habitudes sont importantes ici. Premiรจrement, la place .catch() ร  la fin plutรดt qu'aprรจs chaque รฉtape, car un gestionnaire de terminal reรงoit les rejets de chaque maillon prรฉcรฉdent de la chaรฎne. Deuxiรจmement, utilisez .finally() Pour la libรฉration de ressources telles qu'une connexion ร  une base de donnรฉes, car cette opรฉration s'exรฉcute aussi bien en cas de succรจs qu'en cas d'รฉchec. Troisiรจmement, il ne faut jamais laisser une chaรฎne sans gestion de rejet : un rejet non gรฉrรฉ met fin au processus Node sur les versions actuelles, et Bluebird affichera un avertissement explicite au prรฉalable. Activation de la pile longue traces pendant le dรฉveloppement avec Promise.config({ longStackTraces: true }) facilite grandement la localisation de l'origine d'un rejet.

Erreurs et correctifs de Common Bluebird Promisify

La plupart des problรจmes rencontrรฉs avec Bluebird proviennent de la convention de nommage basรฉe sur les promesses, ou du mรฉlange des styles d'appel de callback et de promesse dans une mรชme chaรฎne, plutรดt que d'un dรฉfaut de la bibliothรจque elle-mรชme. Chaque symptรดme ci-dessous indique sa cause et sa solution.

  • ยซ connectAsync nโ€™est pas une fonction ยป : Le module รฉtait requis directement et non par le biais de promisifyAll()Il n'existe donc pas de variantes asynchrones. Encapsulez l'appel require comme indiquรฉ ci-dessus.
  • Appel de la mรฉthode simple et obtention de la valeur indรฉfinie : connect() Attend toujours un rappel. Seule la copie avec le suffixe Async renvoie une promesse.
  • Passer une fonction de rappel ร  une mรฉthode asynchrone : ne fournir ni rappel ni await et la promesse est rรฉsolue sans observation. Utilisez un style par appel, pas les deux.
  • promisifyAll sur une bibliothรจque dรฉjร  basรฉe sur les promesses : Sans danger mais inutile, cela produit des noms ร  double suffixe sources de confusion. Consultez d'abord la documentation de la bibliothรจque.
  • Erreurs de perte silencieuses : une chaรฎne sans .catch() Masque la raison du rejet jusqu'ร  ce que Node signale un rejet non gรฉrรฉ et s'arrรชte. Terminez toujours la chaรฎne par un bloc catch, mรชme dans les scripts courts.

FAQ

La fonction `promisifyAll` ajoute une copie de chaque mรฉthode au lieu de la remplacer, ce qui permet ร  la version originale de continuer ร  fonctionner. Le suffixe `Async` indique qu'il s'agit de la copie renvoyant une promesse. Ce suffixe est configurable via l'option `promisifier`.

Oui. Les promesses Bluebird sont conformes ร  la norme Promises/A+, donc await Il les accepte exactement comme les modules natifs. Cela permet de convertir un module existant en promesse et de l'utiliser ensuite avec une syntaxe moderne.

Oui. AI Les assistants rรฉรฉcrivent les rappels imbriquรฉs en chaรฎnes de promesses ou en attente asynchrone de maniรจre fiable. Vรฉrifiez ensuite la gestion des erreurs, car les conversions gรฉnรฉrรฉes omettent souvent le bloc `catch` terminal.

des outils d'IA trace quel maillon d'une chaรฎne ne comporte pas d'instruction de retour, la cause habituelle d'un rejetpingIls signalent รฉgalement les chaรฎnes qui ne comportent pas de bloc catch terminal, ce qui transforme une erreur gรฉrรฉe en plantage.

La mรฉthode `Promise.all` attend la rรฉsolution d'un tableau de promesses existant. La mรฉthode `Promise.map` de Bluebird les construit ร  partir de valeurs et accepte une limite de concurrence, ce qui empรชche des milliers de requรชtes simultanรฉes de saturer les sockets.

Rรฉsumez cet article avec :