Bluebird NPM: Bluebird JS obećanje s primjerom

⚡ Pametni sažetak

Bluebird JS je potpuno opremljena Promise biblioteka za JavaSkripta čija je definirajuća sposobnost obećanje: pretvaranje Node modula temeljenih na povratnim pozivima u one koji vraćaju obećanja, tako da cijela biblioteka poput MongoDB Upravljački program se može koristiti asinkrono.

  • 🔵 Osnovna sposobnost: promisifyAll obavija svaku metodu modula, dodajući sufiks Async koji signalizira da metoda sada vraća obećanje.
  • ???? Instalacija: Jedna npm install bluebird naredba dodaje biblioteku, nakon čega require izlaže Promise objekt.
  • 🔗 Lanac: Svaki zatim prima prethodnu vrijednost rezolucije, koja zamjenjuje ugniježđene povratne funkcije ravnim nizom koraka.
  • 🏷️ Pravilo imenovanja: Samo varijante s asinkronim sufiksom vraćaju obećanja; izvorne metode povratnog poziva ostaju nepromijenjene uz njih.
  • 🛡️ Put neuspjeha: Jedan ulov na kraju lanca prima odbijanja iz svakog prethodnog koraka.
  • ⚖️ Moderni kontekst: Izvorna obećanja i asinkrono čekanje sada pokrivaju većinu onoga što je Bluebird nekada jedinstveno pružao.

Obećanja Bluebird JS-a

Što je Bluebird JS?

Bluebird JS je potpuno opremljena Promise biblioteka za JavaSkripta. Njegova najjača značajka je što vam omogućuje "obećavanje" drugih Node modula kako biste ih mogli koristiti asinkrono. Promisify je koncept koji se primjenjuje na callback funkcije i osigurava da svaka callback funkcija koja se pozove vrati vrijednost.

Pa ako a Node.js Modul sadrži funkciju povratnog poziva koja ne vraća vrijednost, što obećava da će modul automatski modificirati sve funkcije u njemu tako da svaka vraća vrijednost.

To znači da možete koristiti Bluebird za izradu MongoDB modul se izvršava asinkrono, što dodaje još jednu razinu jednostavnosti pri pisanju Node.js aplikacija.

Primjer u nastavku prvo uspostavlja vezu s kolekcijom „Employee“ u bazi podataka „EmployeeDB“. Nakon što se veza uspostavi, dohvaća sve zapise u kolekciji i prikazuje ih u konzoli.

Kako generirati obećanja pomoću Bluebird JS biblioteke

Evo korak-po-korak primjera koji pokazuje kako generirati obećanja pomoću Bluebird JS biblioteke.

Korak 1) Instaliranje NPM modula

Za korištenje Bluebirda unutar Node aplikacije potreban je Bluebird modul. Instalirajte ga pomoću naredbe u nastavku:

npm install bluebird

Korak 2) Uključite Bluebird modul

Sljedeći korak je uključivanje Bluebird modula u vaš kod i obećanje cijelog MongoDB modul. Obećavanje ovdje znači da Bluebird osigurava da svaka metoda definirana u MongoDB knjižnica vraća obećanje.

Uključi Bluebird module

Code Objašnjenje:

  1. The require Naredba uključuje biblioteku Bluebird.
  2. Plava ptica .promisifyAll() metoda stvara asinkronu verziju svake metode MongoDB modul pruža, tako da svaki od njih radi u pozadini i vraća obećanje.

Korak 3) Povežite se s bazom podataka

Posljednji korak je povezivanje s bazom podataka, dohvaćanje svih zapisa u kolekciji i njihov prikaz u zapisniku konzole.

Poveži se s bazom podataka

Code Objašnjenje:

  1. Obavijest connectAsync metoda se koristi umjesto uobičajene connect metoda. Bluebird dodaje Asinkroniziraj sufiks svakoj metodi u MongoDB biblioteku za razlikovanje poziva koji vraćaju obećanja od onih koji ne. Metode bez sufiksa Async ne nose takvo jamstvo.
  2. Slično connectAsync je findAsync Metoda vraća sve zapise u MongoDB Kolekcija „Zaposlenik“.
  3. If findAsync uspješno se riješi, sljedeći blok iterira kroz svaki zapis u kolekciji i prikazuje ga u zapisniku konzole.

Ako su gore navedeni koraci ispravno izvedeni, svi dokumenti u kolekciji Employee prikazuju se u konzoli, kao što je prikazano u donjem izlazu.

Bluebird obećava izlaz

Evo kompletnog koda za referencu:

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

⚠️ Napomena o verziji upravljačkog programa: gornji kod cilja MongoDB Upravljački program čvora 2.x, gdje connect rješava se s objektom baze podataka. Iz upravljačkog programa 3.0 nadalje rješava se s MongoClient, pa lanac mora pozvati client.db('EmployeeDB').collection('Employee') umjesto db.collection('Employee')Moderne verzije upravljačkih programa također već vraćaju izvorna obećanja, što čini promisifyAll nepotrebno za MongoDB posebno.

Bluebird vs. Native Promises: Koje koristiti

Kada je Bluebird prvi put napisan, Node uopće nije imao podršku za obećanja, pa je biblioteka popunila pravu prazninu u platformi. Node je isporučivao izvorna obećanja od verzije 4 i async/await od verzije 7.6, što znatno mijenja izračun za svakoga tko danas započinje projekt.

Aspekt plava ptica Domaća obećanja
zavisnost npm paket za instalaciju i održavanje Ugrađeno u runtime
Obećavajući povratni pozivi promisifyAll() pretvara cijeli modul util.promisify() pretvara jednu funkciju
Dodatni pomagači mapa, filter, rekviziti, svaki, vremensko ograničenje, otkazivanje svi, sviNaseljenici, bilo koji, samo rasa
Dugi stog traces Da, kada je omogućeno Poboljšano, ali kraće
Najbolje za Naslijeđene biblioteke povratnih poziva, pomoćnici za konkurentnost Novi kod i sve što koristi asinkronost čekaju

Odaberite izvorna obećanja za novi rad, budući da im nije potrebna ovisnost i izravno se integriraju s async await. Posegnite za Bluebirdom kada ovisnost i dalje izlaže samo povratne pozive ili kada njegovi pomagači za konkurentnost, kao što su Promise.map s ograničenjem konkurentnosti, uštedite značajnu količinu koda.

Kako riješiti greške s Bluebird Promisesima

Gornji primjer nema putanju kvara. Ako MongoDB ne radi ili je naziv kolekcije pogrešan, lanac odbija i ništa se ne ispisuje — proces se jednostavno završava bez objašnjenja. Svaki lanac obećanja treba terminalni rukovatelj.

Bluebird podržava .catch() za odbijanja i .finally() za čišćenje koje se mora izvršavati u oba smjera. Također podržava tipizirane hvatače, koji obrađuju jednu klasu pogrešaka dok dopuštaju širenje drugih.

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

Ovdje su važne tri navike. Prvo, mjesto .catch() na kraju, a ne nakon svakog koraka, jer jedan terminalni rukovatelj prima odbijanja od svake prethodne karike u lancu. Drugo, koristite .finally() za oslobađanje resursa poput veze s bazom podataka, budući da se izvodi i na putu uspjeha i na putu neuspjeha. Treće, nikada ne ostavljajte lanac bez kvake: neobrađeno odbacivanje prekida proces Node na trenutnim verzijama, a Bluebird će prethodno ispisati eksplicitno upozorenje o tome. Omogućavanje dugog stacka tractijekom razvoja s Promise.config({ longStackTraces: true }) znatno olakšava lociranje izvora odbijanja.

Uobičajene greške i ispravci u Bluebird Promisifyju

Većina problema s Bluebirdom proizlazi iz konvencije imenovanja obećanja ili iz miješanja stilova pozivanja povratnog poziva i obećanja u istom lancu, a ne iz bilo kakve greške u samoj biblioteci. Svaki simptom u nastavku navodi svoj uzrok i rješenje.

  • „connectAsync nije funkcija“: modul je bio potreban izravno umjesto putem promisifyAll(), tako da ne postoje asinkrone varijante. Zamotajte require poziv kao što je gore prikazano.
  • Pozivanje obične metode i dobivanje nedefinirane vrijednosti: connect() i dalje očekuje povratni poziv. Samo kopija s asinkronim sufiksom vraća obećanje.
  • Prosljeđivanje povratnog poziva asinkronoj metodi: ne pružaju ni povratni poziv ni await i obećanje se rješava neopaženo. Koristite jedan stil po pozivu, ne oba.
  • promisifyAll na biblioteci koja je već bazirana na obećanjima: bezopasno, ali besmisleno, i stvara zbunjujuća imena s dvostrukim sufiksima. Prvo provjerite dokumentaciju knjižnice.
  • Tiho gubljenje grešaka: lanac bez .catch() skriva razlog odbijanja dok Node ne prijavi neobrađeno odbijanje i ne izađe. Uvijek prekini lanac s naredbom catch, čak i u kratkim skriptama.

Pitanja i odgovori

promisifyAll dodaje kopiju svake metode umjesto da je zamjenjuje, tako da originalna verzija povratnog poziva nastavlja raditi. Sufiks Async označava kopiju koja vraća obećanje. Sufiks se može konfigurirati putem opcije promisifier.

Da. Bluebird obećanja su usklađena s Promises/A+ standardima, tako da await prihvaća ih točno kao izvorne. To vam omogućuje obećanje naslijeđenog modula, a zatim njegovu upotrebu s modernom sintaksom.

Da. AI Asistenti prepisuju ugniježđene povratne funkcije u lance obećanja ili pouzdano asinkrono čekanje. Nakon toga provjerite rukovanje greškama, jer generirane konverzije često gube terminalni catch.

AI alati trace kojoj karici u lancu nedostaje naredba za povratak, uobičajeni uzrok odbijanja escapingTakođer označavaju lance kojima nedostaje terminalni hvatač, što pretvara obrađenu grešku u rušenje.

Promise.all čeka na postojeći niz obećanja. Bluebirdov Promise.map ih gradi od vrijednosti i prihvaća ograničenje konkurentnosti, što sprječava da tisuće istovremenih zahtjeva iscrpe sockete.

Sažmite ovu objavu uz: