Bluebird NPM: Bluebird JS-Versprechen mit Beispiel

⚡ Intelligente Zusammenfassung

Bluebird JS ist eine voll ausgestattete Promise-Bibliothek für JavaEin Skript, dessen Kernkompetenz die Promisifizierung ist: die Umwandlung von Callback-basierten Node-Modulen in Module, die Promises zurückgeben, sodass eine ganze Bibliothek wie die MongoDB Der Treiber kann asynchron verwendet werden.

  • ???? Kernkompetenz: promisifyAll umschließt jede Methode eines Moduls und hängt ein Async-Suffix an, das signalisiert, dass die Methode nun ein Promise zurückgibt.
  • 📦 Installation: Mit einem einzigen npm install bluebird-Befehl wird die Bibliothek hinzugefügt, woraufhin require das Promise-Objekt bereitstellt.
  • 🔗 Verkettung: Anschließend erhält jeder Schritt den vorherigen Auflösungswert, wodurch verschachtelte Rückruffunktionen durch eine flache Abfolge von Schritten ersetzt werden.
  • 🏷️ Namensregel: Nur die Varianten mit dem Suffix Async geben Promises zurück; die ursprünglichen Callback-Methoden bleiben dabei unverändert.
  • 🛡️ Fehlerpfad: Ein einzelner Fangschritt am Ende einer Kette erhält Ablehnungen von jedem vorhergehenden Schritt.
  • Moderner Kontext: Native Promises und async/await decken mittlerweile den größten Teil dessen ab, was Bluebird einst als einziges bot.

Bluebird JS Promises

Was ist Bluebird JS?

Bluebird JS ist eine voll ausgestattete Promise-Bibliothek für JavaDas Skript zeichnet sich dadurch aus, dass es die Verwendung anderer Node-Module durch Promises ermöglicht, um diese asynchron zu nutzen. Promises sind ein Konzept, das auf Callback-Funktionen angewendet wird und sicherstellt, dass jede aufgerufene Callback-Funktion einen Wert zurückgibt.

Also wenn a Node.js Das Modul enthält eine Callback-Funktion, die keinen Wert zurückgibt. Durch die Promisifizierung des Moduls werden automatisch alle Funktionen darin so modifiziert, dass jede einzelne einen Wert zurückgibt.

Das bedeutet, dass Sie Bluebird verwenden können, um Folgendes zu erstellen: MongoDB Das Modul wird asynchron ausgeführt, was die Entwicklung von Node.js-Anwendungen zusätzlich vereinfacht.

Das folgende Beispiel stellt zunächst eine Verbindung zur Sammlung „Employee“ in der Datenbank „EmployeeDB“ her. Sobald die Verbindung hergestellt ist, werden alle Datensätze der Sammlung abgerufen und in der Konsole angezeigt.

So generieren Sie Versprechen mit der Bluebird JS Library

Hier ist ein Beispiel, das Schritt für Schritt zeigt, wie man mit der Bluebird JS-Bibliothek Promises generiert.

Schritt 1) ​​Installation der NPM-Module

Um Bluebird innerhalb einer Node-Anwendung zu verwenden, wird das Bluebird-Modul benötigt. Installieren Sie es mit dem folgenden Befehl:

npm install bluebird

Schritt 2) Fügen Sie das Bluebird-Modul hinzu.

Der nächste Schritt besteht darin, das Bluebird-Modul in Ihren Code einzubinden und den gesamten Code in Promises zu verwandeln. MongoDB Modul. Versprechen bedeutet hier, dass Bluebird sicherstellt, dass jede im Modul definierte Methode MongoDB Die Bibliothek gibt ein Versprechen zurück.

Bluebird-Module einbeziehen

Code Erläuterung:

  1. Das require Der Befehl beinhaltet die Bluebird-Bibliothek.
  2. Blaumeisen .promisifyAll() Die Methode erstellt eine asynchrone Version jeder Methode. MongoDB Das Modul stellt dies bereit, sodass jede Instanz im Hintergrund ausgeführt wird und ein Promise zurückgibt.

Schritt 3) Verbindung zur Datenbank herstellen

Der letzte Schritt besteht darin, eine Verbindung zur Datenbank herzustellen, alle Datensätze der Sammlung abzurufen und sie im Konsolenprotokoll anzuzeigen.

Stellen Sie eine Verbindung zur Datenbank her

Code Erläuterung:

  1. Beachten Sie die connectAsync Anstelle der normalen Methode wird diese verwendet. connect Methode. Bluebird fügt die Asynchron Suffix für jede Methode in der MongoDB Eine Bibliothek, die Aufrufe mit Promise-Rückgabe von solchen ohne Promise-Rückgabe unterscheidet. Methoden ohne das Suffix „Async“ bieten keine solche Garantie.
  2. Ähnlich connectAsync, hat das findAsync Die Methode gibt alle Datensätze im MongoDB Sammlung „Mitarbeiter“.
  3. If findAsync Wenn die Auflösung erfolgreich war, durchläuft der folgende Block jeden Datensatz in der Sammlung und zeigt ihn im Konsolenprotokoll an.

Wenn die oben genannten Schritte ordnungsgemäß ausgeführt werden, werden alle Dokumente der Mitarbeitersammlung in der Konsole angezeigt, wie in der folgenden Ausgabe dargestellt.

Bluebird verspricht Leistung

Hier ist der vollständige Code als Referenz:

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);
        });
    });

⚠️ Hinweis zur Treiberversion: Der obige Code zielt auf MongoDB Node-Treiber 2.x, wobei connect Wird mit einem Datenbankobjekt aufgelöst. Vom Treiber 3.0 weiter Es löst sich mit einem auf MongoClientDie Kette muss also aufrufen client.db('EmployeeDB').collection('Employee') statt db.collection('Employee')Moderne Treiberversionen geben bereits native Promises zurück, was promisifyAll unnötig für MongoDB speziell.

Bluebird vs. Native Promises: Welches ist das richtige?

Als Bluebird entwickelt wurde, bot Node.js keinerlei Unterstützung für Promises, daher füllte die Bibliothek eine echte Lücke in der Plattform. Node.js unterstützt Promises seit Version 4 nativ. async/await seit Version 7.6, was die Berechnung für alle, die heute ein Projekt beginnen, erheblich verändert.

Aspekt Bluebird Native Promises
Abhängigkeit Ein npm-Paket zum Installieren und Warten In die Laufzeitumgebung integriert
Vielversprechende Rückrufe promisifyAll() konvertiert ein ganzes Modul util.promisify() wandelt eine Funktion um
Zusätzliche Helfer map, filter, props, each, timeout, cancellation alle, alle geregelt, jede, nur Rasse
Langer Stapel traces Ja, wenn aktiviert Verbessert, aber kürzer
am besten für Legacy-Callback-Bibliotheken, Hilfsfunktionen für die Parallelverarbeitung Neuer Code und alles, was async/await verwendet.

Verwenden Sie für neue Projekte native Promises, da diese keine Abhängigkeiten benötigen und sich direkt in async/await integrieren lassen. Greifen Sie auf Bluebird zurück, wenn eine Abhängigkeit nur Callbacks bereitstellt oder wenn deren Hilfsfunktionen für die Parallelverarbeitung, wie z. B. … Promise.map Durch die Begrenzung der Parallelverarbeitung lässt sich eine beträchtliche Menge Code einsparen.

Wie man Fehler bei Bluebird-Promises behandelt

Das obige Beispiel hat keinen Fehlerpfad. Wenn MongoDB Wenn die Kette nicht läuft oder der Sammlungsname falsch ist, wird sie abgelehnt und es wird nichts ausgegeben – der Prozess beendet sich einfach ohne Erklärung. Jede Promise-Kette benötigt einen Terminal-Handler.

Bluebird unterstützt .catch() für Ablehnungen und .finally() Für Aufräumarbeiten, die in jedem Fall ausgeführt werden müssen. Es unterstützt außerdem typisierte Catch-Anweisungen, die eine Fehlerklasse behandeln, während andere Fehler weitergeleitet werden.

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(); }
    });

Drei Gewohnheiten sind hier wichtig. Erstens, Platz .catch() Am Ende und nicht nach jedem Schritt, da ein Terminalhandler von jedem vorhergehenden Glied der Kette Ablehnungen empfängt. Zweitens: Verwenden Sie .finally() zum Freigeben von Ressourcen wie Datenbankverbindungen, da dies sowohl im Erfolgs- als auch im Fehlerfall ausgeführt wird. Drittens: Lassen Sie niemals eine Kette ohne Catch-Anweisung: Eine unbehandelte Ablehnung beendet den Node-Prozess in aktuellen Versionen, und Bluebird gibt vorher eine explizite Warnung aus. Aktivieren des Long Stacks traces während der Entwicklung mit Promise.config({ longStackTraces: true }) Dadurch wird es wesentlich einfacher, den Ursprung einer Ablehnung zu finden.

Häufige Bluebird Promisify-Fehler und deren Behebung

Die meisten Probleme mit Bluebird entstehen durch die Verwendung von Promises oder durch die Vermischung von Callback- und Promise-Aufrufen in derselben Kette, und nicht durch einen Fehler in der Bibliothek selbst. Jedes der folgenden Symptome wird mit seiner Ursache und Lösung beschrieben.

  • „connectAsync ist keine Funktion“: Das Modul musste direkt anstatt über den Kanal benötigt werden. promisifyAll()Daher existieren keine asynchronen Varianten. Umschließen Sie den require-Aufruf wie oben gezeigt.
  • Beim Aufruf der einfachen Methode wird „undefined“ zurückgegeben: connect() Es wird weiterhin ein Callback erwartet. Nur die mit dem Suffix „Async“ versehene Kopie gibt ein Promise zurück.
  • Übergabe eines Callbacks an eine asynchrone Methode: weder einen Rückruf noch await und das Promise wird unbeachtet aufgelöst. Verwenden Sie pro Aufruf einen Stil, nicht beide.
  • promisifyAll auf einer bereits auf Promises basierenden Bibliothek: Harmlos, aber sinnlos, und es führt zu verwirrenden Namen mit doppelten Suffixen. Lesen Sie zuerst die Bibliotheksdokumentation.
  • Fehler stillschweigend verlieren: eine Kette ohne .catch() Der Ablehnungsgrund wird so lange verborgen, bis Node eine unbehandelte Ablehnung meldet und beendet wird. Die Kette sollte immer mit einem catch-Block beendet werden, auch in kurzen Skripten.

Häufig gestellte Fragen

`promisifyAll` fügt von jeder Methode eine Kopie hinzu, anstatt sie zu ersetzen, sodass die ursprüngliche Callback-Version weiterhin funktioniert. Das Suffix `Async` kennzeichnet die Kopie, die ein Promise zurückgibt. Dieses Suffix kann über die Option `promisifier` konfiguriert werden.

Ja. Bluebird-Versprechen sind Promises/A+-konform, also await Akzeptiert sie genau wie native Module. Dadurch können Sie ein älteres Modul in Promises umwandeln und es anschließend mit moderner Syntax verwenden.

Ja. AI Assistenten schreiben verschachtelte Rückruffunktionen zuverlässig in Promise-Ketten oder async/await um. Überprüfen Sie die Fehlerbehandlung anschließend, da generierte Konvertierungen häufig den abschließenden catch-Block auslassen.

AI-Werkzeuge tracWenn in einer Kette ein Glied ohne Rückgabeanweisung fehlt, ist dies die übliche Ursache für eine Ablehnung.pingAußerdem kennzeichnen sie Ketten, denen ein abschließender Catch-Mechanismus fehlt, wodurch ein behandelter Fehler zu einem Absturz führt.

Promise.all wartet auf ein bestehendes Array von Promises. Bluebirds Promise.map erstellt diese aus Werten und akzeptiert ein Limit für die gleichzeitige Ausführung, wodurch verhindert wird, dass Tausende von gleichzeitigen Anfragen die Sockets erschöpfen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: