Bluebird NPM: Bluebird JS Promise med eksempel

โšก Smart opsummering

Bluebird JS er et fuldt udstyret Promise-bibliotek til JavaScript hvis definerende evne er promisification: konvertering af callback-baserede nodemoduler til promise-returnerende moduler, sรฅ et helt bibliotek som f.eks. MongoDB Driveren kan bruges asynkront.

  • ???? Kernefunktion: promisifyAll ombryder alle metoder i et modul og tilfรธjer et Async-suffiks, der signalerer, at metoden nu returnerer et promise.
  • ๐Ÿ“ฆ Installation: En enkelt npm install bluebird-kommando tilfรธjer biblioteket, hvorefter require eksponerer Promise-objektet.
  • ๐Ÿ”— Kรฆdning: Hver modtager derefter den forrige oplรธsningsvรฆrdi, som erstatter indbyggede callbacks med en flad rรฆkkefรธlge af trin.
  • ๐Ÿท๏ธ Navngivningsregel: Kun varianter med Async-suffikset returnerer lรธfter; de oprindelige callback-metoder forbliver uรฆndrede ved siden af โ€‹โ€‹dem.
  • ๐Ÿ›ก๏ธ Fejlsti: En enkelt fangst i slutningen af โ€‹โ€‹en kรฆde modtager afvisninger fra hvert foregรฅende trin.
  • โš–๏ธ Moderne kontekst: Native lรธfter og asynkron afventning dรฆkker nu det meste af, hvad Bluebird engang unikt leverede.

Bluebird JS-lรธfter

Hvad er Bluebird JS?

Bluebird JS er et fuldt udstyret Promise-bibliotek til JavaScript. Dens stรฆrkeste funktion er, at den giver dig mulighed for at "promisify" andre Node-moduler for at bruge dem asynkront. Promisify er et koncept, der anvendes pรฅ callback-funktioner, og det sikrer, at hver callback-funktion, der kaldes, returnerer en vรฆrdi.

Sรฅ hvis en node.js Modulet indeholder en callback-funktion, der ikke returnerer en vรฆrdi, og lover, at modulet automatisk รฆndrer alle funktionerne i det, sรฅ hver enkelt returnerer en vรฆrdi.

Det betyder, at du kan bruge Bluebird til at lave MongoDB modulet kรธrer asynkront, hvilket gรธr det endnu nemmere at skrive Node.js-applikationer.

Eksemplet nedenfor opretter fรธrst en forbindelse til samlingen "Employee" i databasen "EmployeeDB". Nรฅr forbindelsen er etableret, hentes alle poster i samlingen og vises i konsollen.

Sรฅdan genererer du lรธfter med Bluebird JS Library

Her er et trin-for-trin eksempel, der viser, hvordan man genererer promises med Bluebird JS-biblioteket.

Trin 1) Installation af NPM-modulerne

For at bruge Bluebird fra en Node-applikation krรฆves Bluebird-modulet. Installer det med kommandoen nedenfor:

npm install bluebird

Trin 2) Inkluder Bluebird-modulet

Det nรฆste trin er at inkludere Bluebird-modulet i din kode og love hele MongoDB modul. At love her betyder, at Bluebird sikrer, at alle metoder defineret i MongoDB biblioteket giver et lรธfte.

Inkluder Bluebird-moduler

Code Forklaring:

  1. require Kommandoen inkluderer Bluebird-biblioteket.
  2. Bluebird's .promisifyAll() Metoden opretter en asynkron version af hver metode MongoDB modulet leverer, sรฅ hver enkelt kรธrer i baggrunden og returnerer et lรธfte.

Trin 3) Opret forbindelse til databasen

Det sidste trin er at oprette forbindelse til databasen, hente alle poster i samlingen og vise dem i konsolloggen.

Opret forbindelse til databasen

Code Forklaring:

  1. Lรฆg mรฆrke til connectAsync metoden anvendes i stedet for den normale connect metode. Bluebird tilfรธjer asynkron suffiks til hver metode i MongoDB biblioteket til at skelne mellem de kald, der returnerer lรธfter, og dem, der ikke gรธr. Metoder uden suffikset Async har ingen sรฅdan garanti.
  2. Svarende til connectAsync, findAsync Metoden returnerer alle poster i MongoDB "Medarbejder"-kollektionen.
  3. If findAsync Hvis det lรธses korrekt, iterererer den fรธlgende blok gennem hver post i samlingen og viser den i konsolloggen.

Hvis ovenstรฅende trin udfรธres korrekt, vises alle dokumenterne i medarbejdersamlingen i konsollen, som vist i outputtet nedenfor.

Bluebird lover output

Her er den komplette kode til reference:

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

โš ๏ธ Bemรฆrkning om driverversion: koden ovenfor mรฅl MongoDB Nodedriver 2.x, hvor connect lรธser med et databaseobjekt. Fra driver 3.0 og fremefter det lรธser sig med en MongoClient, sรฅ kรฆden skal ringe client.db('EmployeeDB').collection('Employee') i stedet for db.collection('Employee')Moderne driverversioner returnerer ogsรฅ allerede native lรธfter, hvilket gรธr promisifyAll unรธdvendig for MongoDB specifikt.

Bluebird vs. Native Promises: Hvilke skal man bruge

Da Bluebird fรธrst blev skrevet, havde Node slet ingen understรธttelse af promises, sรฅ biblioteket udfyldte et reelt hul i platformen. Node har leveret native promises siden version 4 og async/await siden version 7.6, hvilket รฆndrer beregningen betydeligt for alle, der starter et projekt i dag.

Aspect Bluebird Indfรธdte lรธfter
Afhรฆngighed En npm-pakke til installation og vedligeholdelse Indbygget i runtime-funktionen
Lรธfter tilbagekald promisifyAll() konverterer et helt modul util.promisify() konverterer รฉn funktion
Ekstra hjรฆlpere kort, filter, rekvisitter, hver, timeout, annullering alle, alleAfgjort, enhver, kun race
Lang stak traces Ja, nรฅr aktiveret Forbedret men kortere
Bedste for ร†ldre callback-biblioteker, samtidighedshjรฆlpere Ny kode, og alt, der bruger async, venter

Vรฆlg native promises til nyt arbejde, da de ikke krรฆver nogen afhรฆngighed og integrerer direkte med async await. Brug Bluebird, nรฅr en afhรฆngighed stadig kun eksponerer callbacks, eller nรฅr dens samtidighedshjรฆlpere, f.eks. Promise.map med en samtidighedsgrรฆnse, spar en betydelig mรฆngde kode.

Sรฅdan hรฅndterer du fejl med Bluebird Promises

Eksemplet ovenfor har ingen fejlsti. Hvis MongoDB kรธrer ikke, eller samlingsnavnet er forkert, afviser kรฆden, og der udskrives intet โ€” processen afsluttes simpelthen uden forklaring. Enhver lรธftekรฆde har brug for en terminalhandler.

Bluebird-stรธtter .catch() for afslag og .finally() til oprydning, der skal kรธre pรฅ begge mรฅder. Den understรธtter ogsรฅ typede fangster, som hรฅndterer รฉn fejlklasse, mens andre lader sprede sig.

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

Tre vaner er vigtige her. For det fรธrste, sted .catch() i slutningen snarere end efter hvert trin, fordi รฉn terminalhandler modtager afvisninger fra alle foregรฅende led i kรฆden. For det andet, brug .finally() til frigivelse af ressourcer sรฅsom en databaseforbindelse, da den kรธrer pรฅ bรฅde succes- og fiaskostierne. For det tredje, lad aldrig en kรฆde vรฆre uden en fangst: en ubehandlet afvisning afslutter Node-processen pรฅ aktuelle versioner, og Bluebird vil udskrive en eksplicit advarsel om det pรฅ forhรฅnd. Aktivering af long stack traces under udvikling med Promise.config({ longStackTraces: true }) gรธr det langt nemmere at finde oprindelsen af โ€‹โ€‹en afvisning.

Almindelige Bluebird Promisify-fejl og rettelser

De fleste Bluebird-problemer stammer fra den promisified-navngivningskonvention eller fra en blanding af callback- og promise-kaldsstile i samme kรฆde, snarere end fra en fejl i selve biblioteket. Hvert symptom nedenfor angiver sin รฅrsag og sin lรธsning.

  • "connectAsync er ikke en funktion": modulet var pรฅkrรฆvet direkte i stedet for via promisifyAll(), sรฅ der findes ingen async-varianter. Ombryd require-kaldet som vist ovenfor.
  • Kalder plain-metoden og fรฅr udefineret: connect() forventer stadig et callback. Kun kopien med Async-suffikset returnerer et lรธfte.
  • Videregivelse af et callback til en async-metode: hverken give et tilbagekald eller await og lรธftet oplรธses ubemรฆrket. Brug รฉn stil pr. kald, ikke begge.
  • promisifyAll pรฅ et allerede lรธftebaseret bibliotek: harmlรธst, men meningslรธst, og det producerer forvirrende navne med dobbelte suffikser. Tjek fรธrst bibliotekets dokumentation.
  • Mister fejl lydlรธst: en kรฆde uden .catch() skjuler รฅrsagen til afvisningen, indtil Node rapporterer en ubehandlet afvisning og afslutter. Afslut altid kรฆden med en catch, selv i korte scripts.

Ofte Stillede Spรธrgsmรฅl

promisifyAll tilfรธjer en kopi af hver metode i stedet for at erstatte den, sรฅ den originale callback-version fortsรฆtter med at virke. Async-suffikset markerer den promise-returnerende kopi. Suffikset kan konfigureres via promisifier-indstillingen.

Ja. Bluebird-lรธfter er Promises/A+-kompatible, sรฅ await accepterer dem prรฆcis som native moduler. Dette giver dig mulighed for at promisify et รฆldre modul og derefter forbruge det med moderne syntaks.

Ja. AI Assistenter omskriver indlejrede callbacks til promise chains eller async wait pรฅlideligt. Bekrรฆft fejlhรฅndteringen bagefter, da genererede konverteringer ofte mister terminal catch'en.

AI vรฆrktรธjer trachvilket led i en kรฆde mangler en return-sรฆtning, den sรฆdvanlige รฅrsag til en afvisningpingDe markerer ogsรฅ kรฆder, der mangler en terminalfejl, hvilket er det, der forvandler en hรฅndteret fejl til et nedbrud.

Promise.all venter pรฅ et eksisterende array af promises. Bluebirds Promise.map bygger dem ud fra vรฆrdier og accepterer en samtidighedsgrรฆnse, hvilket forhindrer tusindvis af samtidige anmodninger i at udtรธmme sockets.

Opsummer dette indlรฆg med: