Node.js lubaduse õpetus

⚡ Nutikas kokkuvõte

Node.js-i lubadused asendavad sügavalt pesastatud tagasihelistamised tagastatud objektiga, mis arveldab üks kord, seega asünkroonne andmebaasitöö loetakse anonüümsete funktsioonide püramiidi asemel tasaseks siis-klauslite ahelaks.

  • 🔘 Tagasihelistamise probleem: Pesastatud tagasihelistamised kasvavad pikaks ja neid on raske hooldada.
  • ☑️ Lubaduse põhitõed: Lubadus tagastab väärtuse ja arveldatakse täpselt üks kord.
  • ✅ Aheldamine: seejärel tagastab ise lubaduse, seega lisamised toimuvad järjekorras.
  • 🧪 Kohandatud lubadused: q teek denodeify mähib kõik tagasihelistused.
  • 🛠️ Kaasaegne vorm: asünkroonne ja ootav tarbib lubadusi ilma tagasihelistamisteta.
  • 📊 Vea reegel: Töötlemata tagasilükkamised lõpetavad Node.js-i alates versioonist 15.

Node.js lubaduste õpetus, mis näitab lubadustesse aheldatud tagasihelistusi

Varasemates õpetustes oleksite näinud tagasihelistamisfunktsioone, mida kasutatakse asünkroonsete sündmuste jaoks. Kuid mõnikord võivad tagasihelistamisfunktsioonid muutuda õudusunenäoks, kui need hakkavad muutuma pesastatud ning programm muutub pikaks ja keeruliseks.

Mis on lubadused?

Enne kui lubadustega alustame, vaatame uuesti, mis on tagasihelistamise funktsioonid Node.jsOleme neid tagasihelistusfunktsioone eelmistes peatükkides palju näinud, seega vaatame ühe neist kiiresti läbi.

Allolev näide näitab koodilõiku, mida kasutatakse ühenduse loomiseks a MongoDB andmebaasi ja tehke ühe andmebaasi kirjega värskendustoiming.

Node.js tagasihelistusfunktsioon loob ühenduse MongoDB ja kirje uuendamine

  1. Ülaltoodud koodis on funktsiooni osa (err,db) tuntud kui anonüümse või tagasihelistamisfunktsiooni deklaratsioon. Kui MongoClient loob ühenduse MongoDB andmebaasi, naaseb see tagasihelistamisfunktsiooni, kui ühenduse toiming on lõpule viidud. Nii et mõnes mõttes toimuvad ühenduse toimingud taustal ja kui see on tehtud, kutsub see meie tagasihelistamise funktsiooni. Pidage meeles, et see on üks Node.js-i võtmepunkte, mis võimaldavad paljudel toimingutel toimuda samaaegselt ja seega ei takista ühelgi kasutajal toimingu sooritamist.
  2. Teine koodiplokk käivitatakse siis, kui tagasihelistamise funktsioon tegelikult välja kutsutakse. Tagasihelistamise funktsioon värskendab ainult üht meie kirjet MongoDB andmebaas.

Mis on siis lubadus? Noh, lubadus on lihtsalt Node.js-i tagasihelistamise funktsioonide täiustus. Arenduse elutsükli jooksul võib juhtuda, et peate mitu tagasihelistamisfunktsiooni kokku pesastama. See võib teatud ajahetkel muutuda segaseks ja seda on raske hooldada. Lühidalt öeldes on lubadus tagasihelistamiste täiustus, mille eesmärk on nende probleemide leevendamine.

Lubaduse põhisüntaks on näidatud allpool;

var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
  • „doSomethingAync” on mis tahes tagasihelistamis- või asünkroonne funktsioon, mis teeb mingisuguse töötlemise.
  • Seekord on tagasihelistamise määratlemisel väärtus, mis tagastatakse, mida nimetatakse lubaduseks.
  • Kui lubadus tagastatakse, võib sellel olla 2 väljundit. See on määratletud klausliga „siis”. Toiming võib olla edukas, mida tähistatakse parameetriga „onFulfilled”. Või võib sellel olla viga, mida tähistatakse parameetriga „onRejected”.

A lubadus istub ühes kolmest osariigist ja asustab end korra:

riik Tähendus
kuni Töö pole lõppenud.
Täidetud onFulfilled käivitab selle väärtusega.
Tõrjutud onRejected käivitub veaga.

Märge: Seega on lubaduse põhiaspektiks tagastatav väärtus. Node.js-is tavapäraste tagasihelistamisega töötamisel ei ole tagastusväärtuse kontseptsiooni. Tagastusväärtuse tõttu on meil rohkem kontrolli selle üle, kuidas tagasihelistamisfunktsiooni saab määratleda.

Versiooni märkus: need näited töötavad endiselt Node.js 24 peal, mis oli Active LTS liin aastal 2026. Alates Node.js 15-st käsitlemata tagasilükkamine lõpetab protsessi hoiatuse kuvamise asemel, seega sulge iga ahel funktsiooniga .catch().

Järgmises teemas näeme näidet lubadustest ja sellest, kuidas neile tagasihelistamisest kasu on.

Tagasikutsumine lubadustele

Vaatame nüüd näidet selle kohta, kuidas saame Node.js-i rakenduses kasutada lubadusi. Lubaduste kasutamiseks Node.js rakenduses tuleb esmalt alla laadida ja installida lubadusmoodul.

Seejärel muudame oma koodi allpool näidatud viisil, mis uuendab lubaduste abil 'Employee' kollektsioonis olevat EmployeeName'i.

Step 1) Paigaldamine NPM-moodulid

Promise'ide kasutamiseks Node.js rakenduses on vajalik promise moodul. Promise mooduli installimiseks käivitage allolev käsk

npm installi lubadus

Step 2) Muutke koodi lubaduste lisamiseks

Toimetaja ekraanipilt lubadusmoodulist, mis kirjutab ümber MongoDB ajakohastama

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';

MongoClient.connect(url)
    .then(function(err, db) {
        db.collection('Employee').updateOne({
            "EmployeeName": "Martin"
        }, {
            $set: {
                "EmployeeName": "Mohan"
            }
        });
    }); 

Code Selgitus:

  1. Esimene osa on mooduli "lubadus" kaasamine, mis võimaldab meil kasutada lubaduse funktsiooni meie koodis.
  2. Nüüd saame lisada funktsiooni "siis" oma funktsioonile MongoClient.connect. See tähendab, et kui andmebaasiga ühendus luuakse, peame käivitama seejärel määratletud koodijupi.
  3. Lõpuks määratleme oma koodilõigu, mis värskendab Martini nimega töötaja EmployeeName nimeks Mohan.

Märge:

Kui kontrollite nüüd oma MongoDB andmebaasist leiate, et kui on olemas kirje EmployeeName nimega "Martin", värskendatakse seda nimega "Mohan".

Et kontrollida, kas andmed on andmebaasi õigesti sisestatud, peate sisestama järgmised käsud MongoDB

  1. kasutage EmployeeDB-d
  2. db.Employee.find({TöötajaNimi: „Mohan”})

Esimene lause tagab ühenduse EmployeeDB andmebaasiga. Teine lause otsib kirjet, mille töötaja nimi on „Mohan“.

Pesastatud lubadustega tegelemine

Lubaduste määratlemisel tuleb tähele panna, et meetod “siis” ise tagastab lubaduse. Nii et teatud mõttes saab lubadusi üksteise külge pesastada või aheldada.

Allolevas näites kasutame aheldamist, et määratleda 2 tagasihelistamisfunktsiooni, mis mõlemad sisestavad kirje MongoDB andmebaas.

(märkused: Aheldamine on kontseptsioon, mida kasutatakse meetodite täitmise omavaheliseks sidumiseks. Oletagem, et teie rakendusel on kaks meetodit, mida nimetatakse meetodiks A ja meetodiks B. Ja loogika oli selline, et "methodB" tuleks kutsuda pärast "methodA", siis aheldasite täitmise nii, et "methodB" kutsutakse otse pärast "methodA".)

Peamine asi, mida selles näites tähele panna, on see, et kood muutub puhtamaks, loetavamaks ja hooldatavaks, kasutades pesastatud lubadusi.

Aheldatud seejärel klauslid, mis lisavad kaks töötaja kirjet MongoDB

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';
MongoClient.connect(url)

.then(function(db) {
    db.collection('Employee').insertOne({
        Employeeid: 4,
        EmployeeName: "NewEmployee"
    })

    .then(function(db1) {
        db1.collection('Employee').insertOne({
            Employeeid: 5,
            EmployeeName: "NewEmployee1"
        })
    })
});

Code Selgitus:

  1. Nüüd määratleme 2 "siis" klauslit, mis täidetakse üksteise järel. Esimeses klauslis edastame parameetri "db", mis sisaldab meie andmebaasiühendust. Seejärel kasutame "db" ühenduse koguomadust, et sisestada kirjed kogusse "Töötaja". Meetodit "insertOne" kasutatakse tegeliku dokumendi lisamiseks kogusse Töötaja.
  2. Seejärel kasutame 2nd seejärel klausel ka teise kirje lisamiseks andmebaasi.

Kui kontrollite nüüd oma MongoDB andmebaasi, leiate 2 kirjet sinna sisestatud MongoDB andmebaas.

Kaasaegne vaste: async ja await, mis on standardsed alates ES2017-st, tarbivad neid lubadusi ilma tagasihelistamiseta ja on suures osas asendanud generaatoripõhine Voolujuhtimise teegid nagu co, samas kui natiivne Promise'i tugi muudab q ja bluebirdi üleliigseks. Teine plokk näitab, et seejärel võetakse vastu ainult db.

Kohandatud lubaduse loomine

Kohandatud lubaduse saab luua Node.js mooduli nimega 'q' abil. 'q' teek tuleb alla laadida ja Node Package Manageri abil installida. Pärast 'q' teegi kasutamist saab kutsuda meetodit „denodeify“, mis muudab mis tahes funktsiooni lubaduse tagastavaks funktsiooniks.

Allolevas näites loome lihtsa funktsiooni nimega "Lisa", mis lisab 2 numbrit. Teisendame selle funktsiooni lubaduse tagastamise funktsiooniks.

Kui see on tehtud, kasutame funktsiooni Lisa tagastatud lubadust, et kuvada teade failis console.log.

Lubaduse tagastamiseks kohandatud funktsiooni loomiseks järgime allolevaid samme.

Step 1) NPM-moodulite installimine

Node.js rakenduses 'q' kasutamiseks on vajalik 'q' moodul. 'q' mooduli installimiseks käivitage allolev käsk

npm install q

Step 2) Määratlege järgmine kood, mida kasutatakse kohandatud lubaduse loomiseks.

Kohandatud lubadus, mille on loonud wrapping Liitmisfunktsioon q-ga denodeify

Code Selgitus:

  1. Esimene bitt on 'q' teegi kaasamine, kasutades selleks märksõna nõudmist. Seda teeki kasutades saame määratleda mis tahes funktsiooni tagasihelistamise tagastamiseks.
  2. Loome funktsiooni nimega Add, mis liidab 2 muutujates a ja b määratletud numbrit. Nende väärtuste summa salvestatakse muutujasse c.
  3. Seejärel kasutame q teeki oma Add-funktsiooni denodeifitseerimiseks (meetod, mida kasutatakse mis tahes funktsiooni teisendamiseks lubaduse tagastavaks funktsiooniks) ehk teisisõnu, Add-funktsiooni teisendamiseks lubaduse tagastavaks funktsiooniks.
  4. Nüüd kutsume oma funktsiooni "Lisa" ja saame tagasitõotuse väärtuse tänu eelnevale toimingule, mille tegime funktsiooni Lisa denodeifitseerimiseks.
  5. Märksõna 'then' kasutatakse selleks, et määrata, et funktsiooni eduka täitmise korral kuvatakse console.log-failis string „Lisamisfunktsioon on lõpetatud”.

Kui ülaltoodud kood on käivitatud, kuvatakse failis console.log väljund "Lisamisfunktsioon on lõpetatud", nagu allpool näidatud.

Konsooli väljundi printimine. Kohandatud lubadusest täidetud liitmisfunktsioon.

KKK

Alates Node.js 15-st väljub protsess nullist erineva koodiga, mitte hoiatusega. Lisage igale ahelale .catch() või registreerige protsessi käitleja logima ja taastuma.

.catch() saab kõik ahelas varem visatud vead, näiteks try-bloki. .finally() käivitub olenemata sellest, kuidas ahel arveldus, seega sobib see ühenduse sulgemiseks.

Promise.all ebaõnnestub kiiresti, kui üks sisend tagasi lükatakse. allSettled lahendab ja annab alati teada igast tulemusest. race võtab omaks esimese lahendatud tulemuse. any vajab ühte õnnestumist, vastasel juhul viskab AggregateError vea.

Mõlemad kasutavad sama lubadust. await pausid asünkroonse funktsiooni sees, seega tulemused jõuavad tavaliste muutujate juurde ja vead jõuavad try and catch blokki.

Harva. Generator Funktsioonid yield juhtisid kunagi teeke nagu co, aga async ja await katavad selle ülesande natiivselt. Generatorsobivad endiselt laisadele järjestustele ja kohandatud iteraatoritele.

util.promisify teisendab tagasihelistusfunktsiooni otse ja moodulid, näiteks fs.promises, annavad juba lubadused tagasi. Mõlemad asendavad ülaltoodud q teeki.

Jah. Masinõppega analüsaatorid märgistavad tagasilükkamiskäitlejata ahelaid, ootavad sisemisi tsükleid ja järjekorrast sõltuvaid kirjutustoiminguid ning järjestavad seejärel tulemused nii, et testid asuda kõige riskantsematele radadele.

GitHubi koopia ja sarnased agentlikud assistendid kirjutavad pesastatud tagasihelistusi kiiresti ootekõnedeks ümber, kuid iga ümberkirjutust tuleb üle vaadata, kuna veateed ja tee semantika nihkub vaikselt.

Võta see postitus kokku järgmiselt: