Bluebird NPM: Bluebird JS Belofte met voorbeeld

⚡ Slimme samenvatting

Bluebird JS is een volledig functionele Promise-bibliotheek voor JavaScript waarvan de belangrijkste functionaliteit promisificatie is: het omzetten van op callbacks gebaseerde Node-modules naar modules die promises retourneren, zodat een complete bibliotheek zoals de MongoDB De driver kan asynchroon worden gebruikt.

  • 🔵 Kerncapaciteit: promisifyAll omhult elke methode van een module en voegt een Async-achtervoegsel toe dat aangeeft dat de methode nu een promise retourneert.
  • ???? Installatie: Met één enkel `npm install bluebird` commando wordt de bibliotheek geïnstalleerd, waarna `require` het Promise-object beschikbaar maakt.
  • 🔗 ketenen: Elk element ontvangt vervolgens de vorige resolutiewaarde, waardoor geneste callbacks worden vervangen door een vlakke reeks stappen.
  • ???? ️ Naamgevingsregel: Alleen de varianten met het achtervoegsel Async retourneren promises; de oorspronkelijke callback-methoden blijven ongewijzigd.
  • 🛡️ Foutpad: Een enkele vangst aan het einde van een keten ontvangt afwijzingen van elke voorgaande stap.
  • ​ Moderne context: Native promises en async await dekken nu het grootste deel van wat Bluebird ooit uniek bood.

Bluebird JS Beloftes

Wat is Bluebird JS?

Bluebird JS is een volledig functionele Promise-bibliotheek voor JavaScript. De grootste kracht ervan is dat je hiermee andere Node-modules kunt "promisifiëren" om ze asynchroon te gebruiken. Promisifiëren is een concept dat wordt toegepast op callback-functies en zorgt ervoor dat elke aangeroepen callback-functie een waarde retourneert.

Dus als een Node.js Als de module een callbackfunctie bevat die geen waarde retourneert, wordt beloofd dat de module automatisch alle functies erin aanpast, zodat elke functie een waarde retourneert.

Dit betekent dat je Bluebird kunt gebruiken om de MongoDB De module wordt asynchroon uitgevoerd, wat het schrijven van Node.js-applicaties nog eenvoudiger maakt.

Het onderstaande voorbeeld legt eerst een verbinding met de "Employee"-collectie in de "EmployeeDB"-database. Zodra de verbinding tot stand is gebracht, worden alle records in de collectie opgehaald en in de console weergegeven.

Hoe u beloften kunt genereren met Bluebird JS Library

Hieronder volgt een stapsgewijs voorbeeld dat laat zien hoe je promises kunt genereren met de Bluebird JS-bibliotheek.

Stap 1) De NPM-modules installeren

Om Bluebird vanuit een Node-applicatie te gebruiken, is de Bluebird-module vereist. Installeer deze met het onderstaande commando:

npm install bluebird

Stap 2) Voeg de Bluebird-module toe

De volgende stap is het opnemen van de Bluebird-module in je code en het omzetten van de gehele module naar een Promise. MongoDB module. "Promisifying" betekent hier dat Bluebird ervoor zorgt dat elke methode die in de module is gedefinieerd, ook daadwerkelijk wordt uitgevoerd. MongoDB bibliotheek geeft een belofte terug.

Inclusief Bluebird-modules

Code Uitleg:

  1. De require Het commando maakt gebruik van de Bluebird-bibliotheek.
  2. Blauwe vogel .promisifyAll() methode creëert een asynchrone versie van elke methode MongoDB De module biedt de benodigde functionaliteit, zodat elke module op de achtergrond draait en een promise retourneert.

Stap 3) Verbinden met de database

De laatste stap is verbinding maken met de database, alle records in de verzameling ophalen en deze weergeven in het consolelogboek.

Verbinding maken met de database

Code Uitleg:

  1. Let op de connectAsync Deze methode wordt gebruikt in plaats van de normale methode. connect methode. Bluebird voegt de toe asynchrone achtervoegsel bij elke methode in de MongoDB De bibliotheek maakt onderscheid tussen aanroepen die een promise retourneren en aanroepen die dat niet doen. Methoden zonder het achtervoegsel Async bieden deze garantie niet.
  2. Soortgelijke connectAsync findAsync methode retourneert alle records in de MongoDB Collectie "Werknemer".
  3. If findAsync Als de bewerking succesvol is afgerond, doorloopt het volgende blok elk record in de verzameling en geeft het weer in de consolelog.

Als de bovenstaande stappen correct worden uitgevoerd, worden alle documenten in de werknemersverzameling in de console weergegeven, zoals in de onderstaande uitvoer te zien is.

Bluebird belooft output

Hieronder vindt u de volledige code ter referentie:

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

⚠️ Opmerking over de driverversie: de bovenstaande code is gericht op MongoDB Node-stuurprogramma 2.x, waar connect Lost op met een databaseobject. Van driver 3.0 verder het wordt opgelost met een MongoClient, dus de keten moet bellen client.db('EmployeeDB').collection('Employee') in plaats van db.collection('Employee')Moderne driverversies retourneren ook al native promises, wat zorgt voor promisifyAll onnodig voor MongoDB in het bijzonder.

Bluebird versus Native Promises: welke te gebruiken?

Toen Bluebird voor het eerst werd geschreven, bood Node nog helemaal geen ondersteuning voor promises, dus de bibliotheek vulde een echte leemte in het platform. Node biedt sinds versie 4 native ondersteuning voor promises. async/await Sinds versie 7.6 verandert dit de berekening aanzienlijk voor iedereen die vandaag een project start.

Aspect Bluebird Inheemse Beloften
Afhankelijkheid Een npm-pakket om te installeren en te onderhouden. Ingebouwd in de runtime
Beloftevolle terugbelverzoeken promisifyAll() converteert een complete module util.promisify() converteert een functie
Extra helpers kaart, filter, eigenschappen, elk, time-out, annulering alle, volledig geregeld, elk, alleen ras
Lange stapel traces Ja, indien ingeschakeld Verbeterd, maar korter
Best voor Verouderde callback-bibliotheken, hulpmiddelen voor gelijktijdigheid Nieuwe code, en alles wat gebruikmaakt van `async await`.

Kies native promises voor nieuw werk, omdat deze geen afhankelijkheden vereisen en direct integreren met async await. Gebruik Bluebird wanneer een afhankelijkheid nog steeds alleen callbacks beschikbaar stelt, of wanneer de concurrency-hulpmiddelen, zoals Promise.map Met een gelijktijdigheidslimiet bespaar je een aanzienlijke hoeveelheid code.

Hoe om te gaan met fouten bij Bluebird Promises

Het bovenstaande voorbeeld kent geen faalpad. Als MongoDB Als de collectie niet draait of de collectienaam onjuist is, wordt de keten afgewezen en wordt er niets afgedrukt — het proces stopt zonder enige uitleg. Elke promise-keten heeft een eindhandler nodig.

Bluebird ondersteunt .catch() voor afwijzingen en .finally() Voor opruimacties die hoe dan ook moeten worden uitgevoerd. Het ondersteunt ook getypte catch-blokken, die één type fout afhandelen terwijl andere fouten zich blijven verspreiden.

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

Drie gewoonten zijn hier van belang. Ten eerste, plaats .catch() aan het einde in plaats van na elke stap, omdat één eindhandler afwijzingen ontvangt van elke voorgaande schakel in de keten. Ten tweede, gebruik .finally() voor het vrijgeven van resources zoals een databaseverbinding, aangezien dit zowel in het succesvolle als in het mislukte geval wordt uitgevoerd. Ten derde, laat een keten nooit zonder een catch-blok achter: een onafgehandelde afwijzing beëindigt het Node-proces in de huidige versies, en Bluebird zal hierover vooraf een expliciete waarschuwing afdrukken. Het inschakelen van een lange stack traces tijdens de ontwikkeling met Promise.config({ longStackTraces: true }) Hierdoor is de oorzaak van een afwijzing veel gemakkelijker te achterhalen.

Veelvoorkomende fouten en oplossingen bij Bluebird Promisify

De meeste problemen met Bluebird komen voort uit de naamgevingsconventie met promiscue-notaties, of uit het combineren van callbacks en promises in dezelfde keten, in plaats van uit een fout in de bibliotheek zelf. Bij elk symptoom hieronder wordt de oorzaak en de oplossing genoemd.

  • “connectAsync is geen functie”: De module werd direct opgevraagd in plaats van via promisifyAll()Er bestaan ​​dus geen asynchrone varianten. Wikkel de `require`-aanroep in zoals hierboven weergegeven.
  • De eenvoudige methode aanroepen en 'undefined' terugkrijgen: connect() Er wordt nog steeds een callback verwacht. Alleen de versie met het achtervoegsel Async retourneert een promise.
  • Een callback doorgeven aan een asynchrone methode: noch een terugbelverzoek indienen, noch await en de belofte wordt onopgemerkt afgehandeld. Gebruik één stijl per aanroep, niet beide.
  • promisifyAll op een bibliotheek die al op promises gebaseerd is: Onschadelijk maar zinloos, en het levert verwarrende namen met dubbele achtervoegsels op. Raadpleeg eerst de bibliotheekdocumentatie.
  • Fouten ongemerkt kwijtraken: een ketting zonder .catch() Verbergt de reden van de afwijzing totdat Node een onafgehandelde afwijzing meldt en afsluit. Beëindig de keten altijd met een catch-blok, zelfs in korte scripts.

Veelgestelde vragen

promisifyAll voegt een kopie van elke methode toe in plaats van deze te vervangen, zodat de originele callback-versie blijft werken. Het achtervoegsel Async markeert de kopie die een promise retourneert. Dit achtervoegsel is configureerbaar via de promisifier-optie.

Ja. Bluebird-beloftes voldoen aan de Promises/A+-normen, dus await Accepteert ze precies zoals native modules. Hierdoor kun je een legacy-module omzetten naar een Promise en deze vervolgens gebruiken met moderne syntax.

Ja. AI Assistenten herschrijven geneste callbacks betrouwbaar naar promise-ketens of async await. Controleer de foutafhandeling achteraf, omdat gegenereerde conversies vaak de afsluitende catch-blok weglaten.

AI-hulpmiddelen tracAls een schakel in een keten geen return-statement bevat, is de gebruikelijke oorzaak van een afwijzing...pingZe signaleren ook ketens die een afsluitende catch-blok missen, wat ervoor zorgt dat een afgehandelde fout in een crash verandert.

Promise.all wacht op een bestaande array van promises. Bluebird's Promise.map bouwt deze op uit waarden en accepteert een gelijktijdigheidslimiet, wat voorkomt dat duizenden gelijktijdige verzoeken de sockets overbelasten.

Vat dit bericht samen met: