Bluebird NPM: Bluebird JS lubadus koos näitega

⚡ Nutikas kokkuvõte

Bluebird JS on täisfunktsionaalne Promise'i teek, mis on mõeldud JavaSkript, mille defineeriv võime on lubaduste esitamine: tagasihelistuspõhiste Node-moodulite teisendamine lubadusi tagastavateks mooduliteks, seega terve teek, näiteks MongoDB Draiverit saab kasutada asünkroonselt.

  • ???? Põhivõimekus: promisifyAll mähib mooduli iga meetodi, lisades asünkroonse järelliite, mis annab märku, et meetod tagastab nüüd lubaduse.
  • 📦 Paigaldus: Üks npm install bluebird käsk lisab teeki, mille järel require avaldab Promise objekti.
  • 🔗 Aheldamine: Seejärel saab igaüks eelmise resolutsiooni väärtuse, mis asendab pesastatud tagasihelistused lameda sammude jadaga.
  • ???? ️ Nimetamise reegel: Ainult asünkroonsufiksiga variandid tagastavad lubadusi; algsed tagasihelistusmeetodid jäävad koos nendega muutmata.
  • 🛡️ Ebaõnnestumise tee: Üks püügikeerutus ahela lõpus saab tagasilükkamisi igalt eelnevalt sammult.
  • 🇧🇷 Kaasaegne kontekst: Natiivsed lubadused ja asünkroonsed ootused katavad nüüd suurema osa sellest, mida Bluebird kunagi ainulaadselt pakkus.

Bluebird JS lubadused

Mis on Bluebird JS?

Bluebird JS on täisfunktsionaalne Promise'i teek, mis on mõeldud JavaSkript. Selle tugevaim omadus on see, et see võimaldab teil teisi Node'i mooduleid asünkroonselt kasutada. Promisify on tagasihelistusfunktsioonidele rakendatav kontseptsioon ja see tagab, et iga kutsutud tagasihelistusfunktsioon tagastab väärtuse.

Nii et kui a Node.js moodul sisaldab tagasihelistusfunktsiooni, mis ei tagasta väärtust, lubades, et moodul muudab automaatselt kõiki selles olevaid funktsioone nii, et igaüks neist tagastab väärtuse.

See tähendab, et saate Bluebirdi abil teha MongoDB moodul töötab asünkroonselt, mis lisab Node.js rakenduste kirjutamisele veelgi lihtsust.

Allolev näide loob esmalt ühenduse andmebaasi „EmployeeDB“ kollektsiooniga „Employee“. Kui ühendus on loodud, hangib see kõik kollektsiooni kirjed ja kuvab need konsoolis.

Kuidas Bluebird JS raamatukoguga lubadusi luua

Siin on samm-sammult näide, mis näitab, kuidas Bluebird JS teegiga lubadusi genereerida.

1. samm) NPM-moodulite installimine

Bluebirdi kasutamiseks Node'i rakenduses on vajalik Bluebirdi moodul. Paigaldage see järgmise käsuga:

npm install bluebird

2. samm) Lisage Bluebirdi moodul

Järgmine samm on Bluebirdi mooduli lisamine oma koodi ja kogu selle lubamine. MongoDB moodul. Lubadus tähendab siin seda, et Bluebird tagab, et iga moodulis määratletud meetod MongoDB raamatukogu annab lubaduse.

Kaasa Bluebirdi moodulid

Code Selgitus:

  1. . require käsk sisaldab Bluebirdi teeki.
  2. Sinilinnu .promisifyAll() meetod loob iga meetodi asünkroonse versiooni MongoDB moodul pakub, seega igaüks neist töötab taustal ja tagastab lubaduse.

3. samm) Loo ühendus andmebaasiga

Viimane samm on andmebaasiga ühenduse loomine, kõigi kollektsiooni kirjete hankimine ja nende kuvamine konsooli logis.

Ühendu andmebaasiga

Code Selgitus:

  1. Teade connectAsync meetodit kasutatakse tavalise asemel connect meetod. Bluebird lisab Asünk iga meetodi järelliide MongoDB teeki, et eristada lubadusi tagastavaid kõnesid lubadusi mittetagastavatest. Asünkroonse järelliiteta meetodid sellist garantiid ei anna.
  2. Sarnaselt connectAsync, findAsync meetod tagastab kõik kirjed MongoDB „Töötaja” kollektsioon.
  3. If findAsync Kui probleem lahendatakse edukalt, itereerib järgmine plokk läbi iga kollektsiooni kirje ja kuvab selle konsooli logis.

Kui ülaltoodud toimingud on õigesti tehtud, kuvatakse konsoolis kõik töötaja kollektsiooni dokumendid, nagu on näidatud allolevas väljundis.

Bluebird lubab väljundit

Siin on täielik kood viitamiseks:

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

⚠️ Draiveri versiooni märkus: ülaltoodud kood sihtib MongoDB Sõlme draiver 2.x, kus connect lahendab andmebaasiobjekti abil. Draiverilt 3.0 edasi see laheneb a-ga MongoClient, seega peab kett helistama client.db('EmployeeDB').collection('Employee') asemel db.collection('Employee')Kaasaegsed draiveriversioonid tagastavad juba natiivseid lubadusi, mis teeb promisifyAll tarbetu MongoDB konkreetselt.

Bluebird vs Native Promises: millist kasutada

Kui Bluebird esmakordselt kirjutati, polnud Node'il üldse lubaduste tuge, seega täitis see teek platvormil oleva tühimiku. Node on pakkunud natiivseid lubadusi alates versioonist 4 ja async/await alates versioonist 7.6, mis muudab arvutamist märkimisväärselt igaühe jaoks, kes täna projekti alustab.

Aspekt Bluebird Natiivsed lubadused
Sõltuvus Npm-pakett installimiseks ja haldamiseks Käituskeskkonda sisse ehitatud
Paljulubavad tagasihelistamised promisifyAll() teisendab terve mooduli util.promisify() teisendab ühe funktsiooni
Lisaabilised kaart, filter, rekvisiidid, igaüks, ajalõpp, tühistamine kõik, kõikKindlustatud, ükskõik milline, ainult rass
Pikk virn traces Jah, kui lubatud Täiustatud, aga lühem
Parim on Pärandi tagasihelistusteegid, samaaegsuse abilised Uus kood ja kõik, mis kasutab asünkroonset, ootavad

Uue töö jaoks vali natiivsed lubadused, kuna need ei vaja sõltuvust ja integreeruvad otse async await'iga. Kasuta Bluebirdi, kui sõltuvus pakub endiselt ainult tagasihelistusi või kui selle samaaegsuse abifunktsioonid, näiteks Promise.map samaaegsuse piiranguga säästa märkimisväärsel hulgal koodi.

Kuidas Bluebird Promises'i vigadega toime tulla

Ülaltoodud näitel puudub tõrketee. Kui MongoDB ei tööta või kollektsiooni nimi on vale, siis ahel lükkab protsessi tagasi ja midagi ei kuvata – protsess lihtsalt väljub ilma igasuguse selgituseta. Igal lubadusahelal on vaja terminali käitlejat.

Bluebirdi toed .catch() tagasilükkamiste ja .finally() puhastamiseks, mis peab töötama mõlemal viisil. See toetab ka tüüpkinnitusi, mis käsitlevad ühte veaklassi, jättes samal ajal teised levima.

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

Siin on olulised kolm harjumust. Esiteks, koht .catch() lõpus, mitte iga sammu järel, sest üks terminali käitleja saab tagasilükkamisi igalt eelnevalt ahela lülilt. Teiseks, kasutage .finally() ressursside (nt andmebaasiühenduse) vabastamiseks, kuna see töötab nii õnnestumise kui ka ebaõnnestumise teel. Kolmandaks, ärge kunagi jätke ahelat ilma püügivahendita: käsitlemata tagasilükkamine lõpetab Node'i protsessi praegustes versioonides ja Bluebird kuvab selle kohta enne selgesõnalise hoiatuse. Pika pinu lubamine tracarenduse ajal koos Promise.config({ longStackTraces: true }) muudab tagasilükkamise algpõhjuse leidmise palju lihtsamaks.

Levinud Bluebird Promisify vead ja parandused

Enamik Bluebirdi probleeme tuleneb pigem lubatud nimetamiskonventsioonist või tagasihelistus- ja lubaduskõnede stiilide segamisest samas ahelas, mitte teegi enda veast. Iga allpool toodud sümptom nimetab selle põhjuse ja lahenduse.

  • „connectAsync ei ole funktsioon”: moodulit oli vaja otse, mitte läbi promisifyAll(), seega asünkroonseid variante pole olemas. Murra require'i kutse ülaltoodud viisil.
  • Lihtmeetodi kutsumine ja määratlemata saamine: connect() ootab ikka tagasihelistamist. Ainult asünkroonse sufiksiga koopia tagastab lubaduse.
  • Tagasihelistamise edastamine asünkroonsele meetodile: ei paku tagasihelistamist ega await ja lubadus laheneb tähelepanuta jäetuna. Kasutage iga kutse kohta ühte stiili, mitte mõlemat.
  • promisifyAll juba lubaduspõhisel teegil: kahjutu, aga mõttetu ning tekitab segadust tekitavaid topeltlõigliidega nimesid. Kontrolli kõigepealt raamatukogu dokumentatsiooni.
  • Vigade vaikne kaotamine: kett ilma .catch() Peidab tagasilükkamise põhjuse, kuni sõlm teatab käsitlemata tagasilükkamisest ja väljub. Lõpetage ahel alati catch-käsuga, isegi lühikeste skriptide puhul.

KKK

promisifyAll lisab iga meetodi koopia, selle asemel et seda asendada, seega algne tagasihelistusversioon jätkab töötamist. Asünkroonne järelliide tähistab lubadust tagastavat koopiat. Järelliidet saab konfigureerida promisifier valiku kaudu.

Jah. Bluebirdi lubadused vastavad lubaduste/A+ standardile, seega await aktsepteerib neid täpselt nagu natiivseid. See võimaldab teil lubada pärandmoodulit ja seejärel seda moodsa süntaksiga kasutada.

Jah. AI Assistendid kirjutavad pesastatud tagasihelistusi usaldusväärselt ümber lubadusahelateks või asünkroonseks ootamiseks. Kontrollige veakäsitlust hiljem, sest genereeritud konversioonid jätavad terminali püüdmise sageli vahele.

Tehisintellekti tööriistad tracMillisel ahela lülil puudub tagasilükkamise tavapärane põhjus?pingSamuti märgistavad nad ahelaid, millel puudub terminali püüdmismärk, mis muudab käsitletud vea krahhiks.

Promise.all ootab olemasolevat lubaduste massiivi. Bluebirdi Promise.map loob need väärtustest ja aktsepteerib samaaegsuse piirangut, mis takistab tuhandetel samaaegsetel päringutel sokleid ammendamast.

Võta see postitus kokku järgmiselt: