V prejšnjih vajah bi videli funkcije povratnega klica, ki se uporabljajo za asinhrone dogodke. Toda včasih lahko funkcije povratnega klica postanejo nočna mora, ko se začnejo ugnezditi in program začne postajati dolg in zapleten.
V tej vadnici boste izvedeli-
- Kaj so obljube?
- Povratni klici obljubam
- Obravnavanje ugnezdenih obljub
- Ustvarjanje obljube po meri
Kaj so obljube?
Preden začnemo z obljubami, najprej poglejmo, kaj so funkcije »povratnega klica« v Node.js. Te funkcije povratnega klica smo že veliko videli v prejšnjih poglavjih, zato si oglejmo hitro eno od njih.
Spodnji primer prikazuje delček kode, ki se uporablja za povezavo z bazo podatkov MongoDB in izvajanje posodobitve enega od zapisov v bazi.
-
V zgornji kodi je del funkcije (err, db) znan kot izjava anonimne funkcije ali funkcije povratnega klica. Ko MongoClient ustvari povezavo z bazo podatkov MongoDB, se bo po končani operaciji povezave vrnil v funkcijo povratnega klica. Torej se povezave v nekem smislu dogajajo v ozadju in ko je končano, pokliče našo funkcijo povratnega klica. Ne pozabite, da je to ena ključnih točk Node.js, ki omogoča sočasno izvajanje številnih operacij in tako nobenemu uporabniku ne prepreči izvajanja operacije.
-
Drugi blok kode je tisto, kar se izvede, ko je funkcija povratnega klica dejansko poklicana. Funkcija povratnega klica samo posodobi en zapis v naši zbirki podatkov MongoDB.
Kaj je torej obljuba? No, obljuba je le izboljšava funkcij povratnega klica v Node.js. Med razvojnim življenjskim ciklom lahko pride do primera, ko bi morali skupaj ugnezditi več funkcij povratnega klica. To je lahko v določenem trenutku nekako grdo in težko vzdrževati. Skratka, obljuba je izboljšava povratnih klicev, ki je namenjena lajšanju teh težav.
Osnovna skladnja obljube je prikazana spodaj;
var promise = doSomethingAync()promise.then(onFulfilled, onRejected)
- "doSomethingAync" je katera koli povratna klic ali asinhrona funkcija, ki opravi nekakšno obdelavo.
- Tokrat se pri definiranju povratnega klica vrne vrednost, ki se imenuje "obljuba".
- Ko se obljuba vrne, ima lahko 2 izhoda. To je opredeljeno s klavzulo »then«. Vsaka operacija je lahko uspešna, kar je označeno s parametrom 'onFulfilled'. Lahko pa ima napako, ki je označena s parametrom 'onRejected'.
Opomba: Ključni vidik obljube je vrnjena vrednost. Pri delu z običajnimi povratnimi klici v Node.js ni koncepta vrnjene vrednosti. Zaradi vrnjene vrednosti imamo več nadzora nad tem, kako je mogoče definirati funkcijo povratnega klica.
V naslednji temi bomo videli primer obljub in kako imajo koristi od povratnih klicev.
Povratni klici obljubam
Zdaj pa si poglejmo primer, kako lahko uporabimo "obljube" znotraj aplikacije Node.js. Za uporabo obljub v aplikaciji Node.js je treba najprej naložiti in namestiti modul 'obljuba'.
Nato bomo spremenili našo kodo, kot je prikazano spodaj, in s pomočjo obljub posodobijo ime zaposlenega v zbirki 'Zaposleni'.
1. korak) Namestitev NPM modulov
Za uporabo obljub znotraj aplikacije Node JS je potreben modul za obljube. Če želite namestiti modul za obljubo, zaženite spodnji ukaz
npm namestitev obljube
2. korak) Spremenite kodo, da bo vključevala obljube
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"}});});
Pojasnilo kode: -
- Prvi del je vključiti modul "obljuba", ki nam bo omogočil uporabo funkcije obljube v naši kodi.
- Zdaj lahko naši funkciji MongoClient.connect dodamo funkcijo 'then'. To torej naredi, da moramo, ko je povezava vzpostavljena z bazo podatkov, zagnati delček kode, ki je definiran zatem.
- Na koncu določimo še delček kode, ki nadgrajuje EmployeeName zaposlenega z imenom "Martin" na "Mohan".
Opomba:-
Če zdaj preverite vsebino zbirke podatkov MongoDB, boste ugotovili, da bo, če obstaja zapis z imenom EmployeeName za "Martin", posodobljen na "Mohan".
Če želite preveriti, ali so bili podatki pravilno vstavljeni v bazo podatkov, morate v MongoDB izvesti naslednje ukaze
- Uporabite EmployeeDB
- db.E Employee.find ({Ime zaposlenega: Mohan})
Prvi stavek zagotavlja, da ste povezani z bazo podatkov EmployeeDb. Druga izjava išče zapis, v katerem je ime zaposlenega "Mohan".
Obravnavanje ugnezdenih obljub
Pri definiranju obljub je treba opozoriti, da metoda "takrat" sama vrne obljubo. Torej, v nekem smislu lahko obljube ugnezdijo ali priklenejo druga na drugo.
V spodnjem primeru z veriženjem definiramo 2 funkciji povratnega klica, ki vstavita zapis v bazo podatkov MongoDB.
( Opomba : Veriženje je koncept, ki se uporablja za povezovanje izvajanja metod med seboj. Recimo, če bi imela vaša aplikacija 2 metodi, imenovani "methodA" in "methodB." In logika je bila takšna, da bi bilo treba "methodB" poklicati za "methodA," potem bi izvedbo verižili tako, da se "methodB" pokliče neposredno za "methodA.")
Ključno pri tem primeru je, da koda postane čistejša, berljiva in vzdrževalna z uporabo ugnezdenih obljub.
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"})})});
Pojasnilo kode: -
- Zdaj definiramo 2 klavzuli "nato", ki se izvršita eden za drugim. V prvem stavku then posredujemo parameter 'db', ki vsebuje povezavo z bazo podatkov. Nato z lastnostjo zbirke povezave 'db' vstavimo zapise v zbirko 'Zaposleni'. Metoda 'insertOne' se uporablja za vstavljanje dejanskega dokumenta v zbirko Employee.
- Nato z 2. klavzulo then vstavimo še en zapis v bazo podatkov.
Če zdaj preverite vsebino zbirke podatkov MongoDB, boste našli 2 zapisa, vstavljena v zbirko podatkov MongoDB.
Ustvarjanje obljube po meri
Obljubo po meri lahko ustvarite z uporabo modula vozlišča, imenovanega 'q'. Knjižnico 'q' je treba prenesti in namestiti z upraviteljem paketov vozlišč. Po uporabi knjižnice 'q' lahko pokličete metodo "denodeify", zaradi katere bo katera koli funkcija postala funkcija, ki vrne obljubo.
V spodnjem primeru bomo ustvarili preprosto funkcijo, imenovano "Dodaj", ki bo dodala dve številki. To funkcijo bomo pretvorili v funkcijo za vrnitev obljube.
Ko je to storjeno, bomo za prikaz sporočila v console.log uporabili obljubo, ki jo vrne funkcija Dodaj.
Sledimo spodnjim korakom za ustvarjanje naše funkcije po meri za vrnitev obljube.
1. korak) Namestitev NPM modulov
Za uporabo 'q' znotraj aplikacije Node JS je potreben modul 'q'. Če želite namestiti modul 'q', zaženite spodnji ukaz
npm namestite q
Korak 2) Določite naslednjo kodo, ki bo uporabljena za izdelavo obljube po meri.
Pojasnilo kode: -
- Prvi bit je vključitev knjižnice 'q' z uporabo ključne besede require. Z uporabo te knjižnice bomo lahko definirali katero koli funkcijo za vrnitev povratnega klica.
- Ustvarjamo funkcijo z imenom Add, ki bo dodala dve številki, opredeljeni v spremenljivkah a in b. Vsota teh vrednosti bo shranjena v spremenljivki c.
- Nato s pomočjo knjižnice q denodeify (metoda, uporabljena za pretvorbo katere koli funkcije v funkcijo, ki bi vrnila obljubo) našo funkcijo Add ali drugače pretvorimo našo funkcijo Add v funkcijo, ki vrne obljubo.
- Zdaj pokličemo funkcijo »Dodaj« in lahko dobimo vrednost obljube o vrnitvi zaradi predhodnega koraka, ki smo ga izvedli pri denodeifikaciji funkcije Dodaj.
- Uporabljena je ključna beseda 'then', ki določa, da če je funkcija uspešno izvedena, potem v console.log prikaže niz "Funkcija dodajanja zaključena".
Ko se zgornja koda zažene, bo v console.log prikazan izhod "Funkcija dodajanja zaključena", kot je prikazano spodaj.
Povzetek
- Uporaba funkcij povratnega klica v Node.js ima svoje slabosti. Včasih med postopkom razvoja lahko ugnezdena uporaba funkcij povratnega klica naredi kodo bolj zapleteno in jo je težko vzdrževati.
- Večino težav z ugnezdenimi funkcijami povratnega klica je mogoče ublažiti z uporabo obljub in generatorjev v node.js
- Promise je vrednost, ki jo vrne asinhrona funkcija, ki označuje zaključek obdelave, ki jo izvaja asinhrona funkcija.
- Obljube lahko med seboj ugnezdijo, da je koda videti boljša in enostavnejša za vzdrževanje, kadar je treba po drugi asinhroni funkciji poklicati asinhrono funkcijo