Bluebird NPM: Bluebird JS Promise med exempel

โšก Smart sammanfattning

Bluebird JS รคr ett fullfjรคdrat Promise-bibliotek fรถr JavaSkript vars definierande fรถrmรฅga รคr promisifiering: konvertera callback-baserade Node-moduler till promise-returnerande moduler, sรฅ ett helt bibliotek som MongoDB Drivrutinen kan anvรคndas asynkront.

  • ???? Kรคrnkapacitet: promisifyAll omsluter varje metod i en modul och lรคgger till ett Async-suffix som signalerar att metoden nu returnerar ett lรถfte.
  • ๐Ÿ“ฆ Installation: Ett enda npm install bluebird-kommando lรคgger till biblioteket, varefter require exponerar Promise-objektet.
  • ๐Ÿ”— Kedjning: Var och en fรฅr sedan det fรถregรฅende upplรถsningsvรคrdet, vilket ersรคtter kapslade รฅteranrop med en platt sekvens av steg.
  • ๐Ÿท๏ธ Namngivningsregel: Endast varianterna med suffixet Async returnerar lรถften; de ursprungliga รฅteranropsmetoderna fรถrblir ofรถrรคndrade bredvid dem.
  • ๐Ÿ›ก๏ธ Felsรถkvรคg: En enda fรฅngst i slutet av en kedja fรฅr avslag frรฅn varje fรถregรฅende steg.
  • โš–๏ธ Modern kontext: Inbyggda lรถften och async await tรคcker nu det mesta av vad Bluebird en gรฅng i tiden unikt tillhandahรถll.

Bluebird JS-lรถften

Vad รคr Bluebird JS?

Bluebird JS รคr ett fullfjรคdrat Promise-bibliotek fรถr JavaSkript. Dess starkaste funktion รคr att den lรฅter dig "promisify" andra Node-moduler fรถr att kunna anvรคnda dem asynkront. Promisify รคr ett koncept som tillรคmpas pรฅ callback-funktioner, och det sรคkerstรคller att varje callback-funktion som anropas returnerar ett vรคrde.

Sรฅ om en node.js Modulen innehรฅller en callback-funktion som inte returnerar ett vรคrde, vilket lovar att modulen automatiskt modifierar alla funktioner i den sรฅ att var och en returnerar ett vรคrde.

Det hรคr betyder att du kan anvรคnda Bluebird fรถr att gรถra MongoDB modulen kรถrs asynkront, vilket gรถr det รคnnu enklare att skriva Node.js-applikationer.

Exemplet nedan upprรคttar fรถrst en anslutning till samlingen โ€Employeeโ€ i databasen โ€EmployeeDBโ€. Nรคr anslutningen รคr upprรคttad hรคmtas alla poster i samlingen och visas i konsolen.

Hur man skapar lรถften med Bluebird JS Library

Hรคr รคr ett steg-fรถr-steg-exempel som visar hur man genererar lรถften med Bluebird JS-biblioteket.

Steg 1) Installera NPM-modulerna

Fรถr att anvรคnda Bluebird inifrรฅn en Node-applikation krรคvs Bluebird-modulen. Installera den med kommandot nedan:

npm install bluebird

Steg 2) Inkludera Bluebird-modulen

Nรคsta steg รคr att inkludera Bluebird-modulen i din kod och lova hela MongoDB modulen. Att lova hรคr innebรคr att Bluebird sรคkerstรคller att varje metod som definieras i MongoDB biblioteket ger ett lรถfte.

Inkludera Bluebird-moduler

Code Fรถrklaring:

  1. Ocuco-landskapet require kommandot inkluderar Bluebird-biblioteket.
  2. Bluebird's .promisifyAll() Metoden skapar en asynkron version av varje metod MongoDB modulen tillhandahรฅller, sรฅ var och en kรถrs i bakgrunden och returnerar ett lรถfte.

Steg 3) Anslut till databasen

Det sista steget รคr att ansluta till databasen, hรคmta alla poster i samlingen och visa dem i konsolloggen.

Anslut till databasen

Code Fรถrklaring:

  1. Lรคgg mรคrke till connectAsync metoden anvรคnds istรคllet fรถr den vanliga connect metod. Bluebird lรคgger till Asynk suffix till varje metod i MongoDB bibliotek fรถr att skilja de anrop som returnerar lรถften frรฅn de som inte gรถr det. Metoder utan suffixet Async har ingen sรฅdan garanti.
  2. Liknar connectAsync, den findAsync metoden returnerar alla poster i MongoDB "Anstรคlld"-kollektionen.
  3. If findAsync lรถses korrekt itererar fรถljande block igenom varje post i samlingen och visar den i konsolloggen.

Om stegen ovan utfรถrs korrekt visas alla dokument i Employee-samlingen i konsolen, som visas i utdata nedan.

Bluebird lovar produktion

Hรคr รคr den kompletta koden fรถr referens:

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

โš ๏ธ Anmรคrkning om drivrutinsversion: koden ovan mรฅl MongoDB Noddrivrutin 2.x, dรคr connect lรถser med ett databasobjekt. Frรฅn drivrutinen 3.0 och framรฅt det lรถser sig med en MongoClient, sรฅ kedjan mรฅste ringa client.db('EmployeeDB').collection('Employee') istรคllet fรถr db.collection('Employee')Moderna drivrutinsversioner returnerar ocksรฅ redan inbyggda lรถften, vilket gรถr promisifyAll onรถdig fรถr MongoDB specifikt.

Bluebird vs Native Promises: Vilken ska man anvรคnda

Nรคr Bluebird fรถrst skrevs hade Node inget stรถd fรถr promises alls, sรฅ biblioteket fyllde ett verkligt tomrum i plattformen. Node har levererat native promises sedan version 4 och async/await sedan version 7.6, vilket fรถrรคndrar berรคkningen avsevรคrt fรถr alla som startar ett projekt idag.

Aspect Bluebird Infรถdda lรถften
Dependency Ett npm-paket att installera och underhรฅlla Inbyggt i kรถrtiden
Lovande รฅteruppringningar promisifyAll() konverterar en hel modul util.promisify() konverterar en funktion
Extra hjรคlpare karta, filter, rekvisita, varje, timeout, avbokning alla, allaFaststรคllda, valfri, endast ras
Lรฅng stapel traces Ja, nรคr den รคr aktiverad Fรถrbรคttrad men kortare
Bรคst fรถr ร„ldre รฅteranropsbibliotek, samtidighetshjรคlpare Ny kod och allt som anvรคnder async vรคntar

Vรคlj nativa lรถften fรถr nytt arbete, eftersom de inte behรถver nรฅgot beroende och integreras direkt med async await. Anvรคnd Bluebird nรคr ett beroende fortfarande endast exponerar รฅteranrop, eller nรคr dess samtidighetshjรคlpare, som till exempel Promise.map med en samtidighetsgrรคns, spara en betydande mรคngd kod.

Hur man hanterar fel med Bluebird Promises

Exemplet ovan har ingen felvรคg. Om MongoDB inte kรถrs, eller om samlingsnamnet รคr fel, avvisas kedjan och ingenting skrivs ut โ€” processen avslutas helt enkelt utan fรถrklaring. Varje lรถfteskedja behรถver en terminalhanterare.

Bluebird-stรถd .catch() fรถr avslag och .finally() fรถr rensning som mรฅste kรถras รฅt bรฅda hรฅllen. Den stรถder รคven typade fรฅngster, som hanterar en felklass medan andra sprider 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 vanor spelar roll hรคr. Fรถr det fรถrsta, plats .catch() i slutet snarare รคn efter varje steg, eftersom en terminalhanterare tar emot avslag frรฅn varje fรถregรฅende lรคnk i kedjan. Fรถr det andra, anvรคnd .finally() fรถr att frigรถra resurser som en databasanslutning, eftersom den kรถrs pรฅ bรฅde lyckade och misslyckade vรคgar. Fรถr det tredje, lรคmna aldrig en kedja utan en fรฅngst: en ohanterad avvisning avslutar Node-processen i aktuella versioner, och Bluebird kommer att skriva ut en uttrycklig varning om det i fรถrvรคg. Aktivera lรฅng stack traces under utveckling med Promise.config({ longStackTraces: true }) gรถr det mycket lรคttare att lokalisera ursprunget till ett avslag.

Vanliga Bluebird Promisify-fel och lรถsningar

De flesta Bluebird-problem uppstรฅr pรฅ grund av namngivningskonventionen Promisified, eller frรฅn att man blandar callback- och promise-anropsstilarna i samma kedja, snarare รคn frรฅn nรฅgot fel i sjรคlva biblioteket. Varje symptom nedan anger dess orsak och lรถsning.

  • "connectAsync รคr inte en funktion": modulen behรถvdes direkt istรคllet fรถr via promisifyAll(), sรฅ inga async-varianter finns. Radbryt require-anropet som visas ovan.
  • Anropar plain-metoden och fรฅr odefinierad: connect() fรถrvรคntar sig fortfarande en รฅteranropning. Endast kopian med async-suffixet returnerar ett lรถfte.
  • Skicka en รฅteranrop till en async-metod: leverera varken en รฅteruppringning eller await och lรถftet lรถses obemรคrkt. Anvรคnd en stil per anrop, inte bรฅda.
  • promisifyAll pรฅ ett redan promise-baserat bibliotek: ofarligt men meningslรถst, och det producerar fรถrvirrande namn med dubbla suffix. Kontrollera bibliotekets dokumentation fรถrst.
  • Fรถrlora fel i tysthet: en kedja utan .catch() dรถljer orsaken till avslaget tills Node rapporterar ett ohanterat avslag och avslutar. Avsluta alltid kedjan med en catch, รคven i korta skript.

Vanliga frรฅgor

promisifyAll lรคgger till en kopia av varje metod istรคllet fรถr att ersรคtta den, sรฅ att den ursprungliga รฅteranropsversionen fortsรคtter att fungera. Suffixet Async markerar den promise-returnerande kopian. Suffixet kan konfigureras via promisifier-alternativet.

Ja. Bluebird-lรถftena uppfyller Promises/A+-kraven, sรฅ await accepterar dem precis som inbyggda modular. Detta lรฅter dig lova en รคldre modul och sedan anvรคnda den med modern syntax.

Ja. AI Assistenter skriver om kapslade รฅteranrop till lรถftekedjor eller async wait pรฅ ett tillfรถrlitligt sรคtt. Verifiera felhanteringen efterรฅt, eftersom genererade konverteringar ofta tappar terminalfรฅngsten.

AI-verktyg trace vilken lรคnk i en kedja saknar en retursats, den vanliga orsaken till ett avslag escapingDe flaggar ocksรฅ kedjor som saknar en terminalfรฅngst, vilket รคr det som fรถrvandlar ett hanterat fel till en krasch.

Promise.all vรคntar pรฅ en befintlig array av promises. Bluebirds Promise.map bygger dem frรฅn vรคrden och accepterar en samtidighetsgrรคns, vilket fรถrhindrar att tusentals samtidiga fรถrfrรฅgningar uttรถmmer sockets.

Sammanfatta detta inlรคgg med: