U prethodnim vodičima vidjeli biste funkcije povratnog poziva koje se koriste za asinkrone događaje. Ali ponekad funkcije povratnog poziva mogu postati noćna mora kad se počnu ugniježđavati, a program počinje postajati dug i složen.
U ovom vodiču naučit ćete-
- Što su obećanja?
- Povratni pozivi obećanjima
- Suočavanje s ugniježđenim obećanjima
- Stvaranje prilagođenog obećanja
Što su obećanja?
Prije nego što započnemo s obećanjima, prvo ponovno posjetimo funkcije "povratnog poziva" u Node.js. Ove smo funkcije povratnog poziva puno vidjeli u prethodnim poglavljima, pa prođimo brzo kroz jedno od njih.
Primjer u nastavku prikazuje isječak koda koji se koristi za povezivanje s bazom podataka MongoDB i izvođenje operacije ažuriranja jednog od zapisa u bazi podataka.
-
U gornjem kodu dio funkcije (err, db) poznat je kao deklaracija anonimne ili funkcije povratnog poziva. Kada MongoClient stvori vezu s bazom podataka MongoDB, vratit će se na funkciju povratnog poziva nakon završetka postupka povezivanja. Dakle, u određenom smislu, operacije povezivanja događaju se u pozadini, a kada se to učini, poziva našu funkciju povratnog poziva. Imajte na umu da je ovo jedna od ključnih točaka Node.js-a kako bi se omogućilo istodobno odvijanje mnogih operacija i na taj način ne blokiralo bilo kojeg korisnika da izvrši operaciju.
-
Drugi blok koda je ono što se izvršava kad se zapravo pozove funkcija povratnog poziva. Funkcija povratnog poziva samo ažurira jedan zapis u našoj bazi podataka MongoDB.
Pa, što je onda obećanje? Pa, obećanje je samo poboljšanje funkcija povratnog poziva u Node.js. Tijekom razvojnog životnog ciklusa može postojati instanca u kojoj biste trebali ugnijezditi više funkcija povratnog poziva. To u određenom trenutku može postati nekako neuredno i teško ga je održavati. Ukratko, obećanje je poboljšanje povratnih poziva koje ima za cilj ublažavanje ovih problema.
Osnovna sintaksa obećanja prikazana je u nastavku;
var promise = doSomethingAync()promise.then(onFulfilled, onRejected)
- "doSomethingAync" je bilo koja funkcija povratnog poziva ili asinkrona funkcija koja vrši neku vrstu obrade.
- Ovaj put, prilikom definiranja povratnog poziva, vraća se vrijednost koja se naziva "obećanje".
- Kada se obećanje vrati, može imati 2 izlaza. To je definirano "klauzulom". Bilo koja operacija može biti uspješna što se označava parametrom 'onFulfilled'. Ili može imati pogrešku koja je označena parametrom 'onRejected'.
Napomena: Dakle, ključni aspekt obećanja je povratna vrijednost. Ne postoji koncept povratne vrijednosti pri radu s normalnim povratnim pozivima u Node.js. Zbog povratne vrijednosti imamo veću kontrolu nad načinom na koji se funkcija povratnog poziva može definirati.
U sljedećoj ćemo temi vidjeti primjer obećanja i kako imaju koristi od povratnih poziva.
Povratni pozivi obećanjima
Sada pogledajmo primjer kako možemo koristiti "obećanja" iz Node.js aplikacije. Da biste koristili obećanja u aplikaciji Node.js, modul 'obećanje' prvo treba preuzeti i instalirati.
Zatim ćemo izmijeniti naš kod kao što je prikazano u nastavku, koji ažurira Ime zaposlenika u zbirci 'Zaposlenik' pomoću obećanja.
Korak 1) Instaliranje NPM modula
Da biste koristili obećanja iz aplikacije Node JS, potreban je modul obećanja. Da biste instalirali obećavajući modul, pokrenite naredbu u nastavku
npm instalacijsko obećanje
Korak 2) Izmijenite kôd tako da uključuje obećanja
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"}});});
Objašnjenje koda: -
- Prvi je dio uključiti modul 'obećanja' koji će nam omogućiti upotrebu funkcije obećanja u našem kodu.
- Sada našoj funkciji MongoClient.connect možemo dodati funkciju 'tada'. Dakle, ovo što radi je da kada se uspostavi veza s bazom podataka, trebamo izvršiti isječak koda definiran nakon toga.
- Konačno, definiramo naš isječak koda koji obavlja posao ažuriranja EmployeeName zaposlenika s imenom "Martin" na "Mohan".
Bilješka:-
Ako sada provjerite sadržaj svoje baze podataka MongoDB, otkrit ćete da će, ako postoji zapis s imenom EmployeeName za "Martin", biti ažuriran na "Mohan".
Da biste provjerili jesu li podaci pravilno umetnuti u bazu podataka, u MongoDB morate izvršiti sljedeće naredbe
- Koristite EmployeeDB
- db.E Employee.find ({Ime zaposlenika: Mohan})
Prva izjava osigurava da ste povezani s bazom podataka EmployeeDb. Druga izjava traži zapis koji ima ime zaposlenika "Mohan".
Suočavanje s ugniježđenim obećanjima
Pri definiranju obećanja treba imati na umu da metoda "tada" sama vraća obećanje. Dakle, u određenom smislu, obećanja mogu biti ugniježđena ili vezana jedno za drugo.
U donjem primjeru lancem koristimo definiranje 2 funkcije povratnog poziva, koje obje ubacuju zapis u bazu podataka MongoDB.
( Napomena : Chaining je koncept koji se koristi za povezivanje izvršavanja metoda međusobno. Pretpostavimo da je vaša aplikacija imala 2 metode nazvane 'methodA' i 'methodB.' A logika je bila takva da bi 'methodB' trebalo pozvati nakon 'methodA', tada biste izvršili lančanje na takav način da se 'methodB' poziva neposredno nakon 'methodA.')
Ključna stvar koju treba primijetiti u ovom primjeru je da kôd postaje čišći, čitljiviji i održiviji pomoću ugniježđenih obećanja.
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"})})});
Objašnjenje koda: -
- Sada definiramo dvije klauzule "tada" koje se izvršavaju jedna za drugom. U prvoj klauzuli tada prosljeđujemo parametar 'db' koji sadrži našu vezu s bazom podataka. Zatim koristimo svojstvo zbirke veze 'db' za umetanje zapisa u zbirku 'Zaposlenik'. Metoda 'insertOne' koristi se za umetanje stvarnog dokumenta u kolekciju zaposlenika.
- Zatim koristimo klauzulu 2 i then za umetanje drugog zapisa u bazu podataka.
Ako sada provjerite sadržaj svoje baze podataka MongoDB, pronaći ćete 2 zapisa umetnuta u bazu podataka MongoDB.
Stvaranje prilagođenog obećanja
Prilagođeno obećanje može se stvoriti korištenjem modula čvora nazvanog 'q'. Knjižnicu 'q' treba preuzeti i instalirati pomoću upravitelja paketa čvorova. Nakon upotrebe knjižnice 'q', može se pozvati metoda "denodeify" koja će uzrokovati da bilo koja funkcija postane funkcija koja vraća obećanje.
U donjem primjeru stvorit ćemo jednostavnu funkciju nazvanu "Dodaj" koja će dodati 2 broja. Pretvorit ćemo ovu funkciju u funkciju za vraćanje obećanja.
Kad je to gotovo, upotrijebit ćemo obećanje koje je vratila funkcija Dodaj za prikaz poruke u console.log.
Slijedimo korake u nastavku za stvaranje vlastite funkcije za vraćanje obećanja.
Korak 1) Instaliranje NPM modula
Da biste koristili 'q' iz Node JS aplikacije, potreban je modul 'q'. Da biste instalirali modul 'q', pokrenite naredbu u nastavku
npm instalirati q
Korak 2) Definirajte sljedeći kod koji će se koristiti za stvaranje prilagođenog obećanja.
Objašnjenje koda: -
- Prvi bit je uključivanje knjižnice 'q' pomoću ključne riječi require. Korištenjem ove knjižnice moći ćemo definirati bilo koju funkciju za povratak povratnog poziva.
- Stvaramo funkciju zvanu Add koja će dodati 2 broja definirana u varijablama a i b. Zbroj ovih vrijednosti pohranit će se u varijablu c.
- Zatim koristimo q biblioteku za denodeifikaciju (metoda koja se koristi za pretvaranje bilo koje funkcije u funkciju koja bi vratila obećanje) naše funkcije Add ili za pretvaranje naše funkcije Add u funkciju koja vraća obećanje.
- Sada pozivamo našu funkciju "Dodaj" i možemo dobiti vrijednost obećanja za povrat zbog prethodnog koraka koji smo izvršili denodeificirati funkciju Dodaj.
- Upotrijebljena je ključna riječ 'then' koja u slučaju da se funkcija izvrši uspješno prikazuje niz "Funkcija dodavanja dovršena" u console.log.
Kada se pokrene gornji kôd, izlaz "Funkcija dodavanja dovršena" prikazat će se u console.log kao što je prikazano dolje.
Sažetak
- Korištenje funkcija povratnog poziva u Node.js ima svojih nedostataka. Ponekad tijekom procesa razvoja ugniježđena upotreba funkcija povratnog poziva može kod učiniti neurednijim i teškim za održavanje.
- Većina problema s ugniježđenim funkcijama povratnog poziva može se ublažiti upotrebom obećanja i generatora u node.js
- Promise je vrijednost koju vraća asinkrona funkcija kako bi ukazala na završetak obrade koju provodi asinhrona funkcija.
- Obećanja se mogu ugnijezditi jedno u drugo kako bi kod izgledao bolje i lakše ga je održavati kada asinhronu funkciju treba pozvati nakon druge asinkrone funkcije