Vodič za obećanje Node.js
U prethodnim vodičima vidjeli ste funkcije povratnog poziva koje se koriste za asinkrone događaje. Ali ponekad funkcije povratnog poziva mogu postati noćna mora kada se počnu ugniježđivati, a program postane dug i složen.
Što su obećanja?
Prije nego što počnemo s obećanjima, prvo ponovno razmotrimo što su funkcije “povratnog poziva” u Node.js. Mnogo smo vidjeli ove funkcije povratnog poziva u prethodnim poglavljima, pa idemo brzo proći kroz jednu od njih.
Primjer u nastavku prikazuje isječak koda koji se koristi za povezivanje s a MongoDB bazu podataka i izvršite operaciju ažuriranja jednog od zapisa u bazi podataka.
- U gornjem kodu, dio funkcije (err,db) poznat je kao deklaracija anonimne funkcije ili funkcije povratnog poziva. Kada MongoClient stvori vezu s MongoDB baze podataka, vratit će se na funkciju povratnog poziva nakon završetka operacije povezivanja. Dakle, u određenom smislu, operacije povezivanja odvijaju se u pozadini, a kada su gotove, pozivaju našu funkciju povratnog poziva. Imajte na umu da je ovo jedna od ključnih točaka Node.js-a koja omogućuje istovremeno odvijanje mnogih operacija i na taj način ne blokira nijednog korisnika u izvođenju operacije.
- Drugi blok koda je ono što se izvršava kada se stvarno pozove funkcija povratnog poziva. Funkcija povratnog poziva samo ažurira jedan zapis u našem MongoDB baza podataka.
Pa što je onda obećanje? Pa, obećanje je samo poboljšanje funkcija povratnog poziva u Node.js. Tijekom životnog ciklusa razvoja može doći do slučaja kada biste trebali ugniježditi više funkcija povratnog poziva zajedno. To može postati neuredno i teško ga je održavati u određenom trenutku. Ukratko, obećanje je poboljšanje povratnih poziva koje teži ublažavanju ovih problema.
Osnovna sintaksa obećanja prikazana je u nastavku;
var promise = doSomethingAync() promise.then(onFulfilled, onRejected)
- "doSomethingAync" je bilo koji povratni poziv ili asinkrona funkcija koja obavlja neku vrstu obrade.
- Ovaj put, kada se definira povratni poziv, postoji vrijednost koja se vraća pod nazivom "obećanje".
- Kada se obećanje vrati, ono može imati 2 izlaza. To je definirano klauzulom 'then'. Ili operacija može biti uspješna što je označeno parametrom 'onFulfilled'. Ili može imati pogrešku koja je označena parametrom 'onRejected'.
Bilješka: Dakle, ključni aspekt obećanja je povratna vrijednost. Ne postoji koncept povratne vrijednosti kada se radi 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 temi vidjet ćemo primjer obećanja i kakvu korist imaju od povratnih poziva.
Povratni pozivi na obećanja
Sada pogledajmo primjer kako možemo koristiti “obećanja” unutar Node.js aplikacije. Kako biste koristili obećanja u aplikaciji Node.js, prvo morate preuzeti i instalirati modul 'promise'.
Zatim ćemo modificirati naš kod kao što je prikazano u nastavku, koji ažurira Employeename u kolekciji 'Employee' korištenjem obećanja.
Korak 1) Instaliranje NPM modula
Za korištenje Promisesa unutar Node JS aplikacije potreban je modul obećanja. Da biste instalirali obećavajući modul, pokrenite donju naredbu
obećanje instalacije npm-a
Korak 2) Izmijenite kod da uključi 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 dio je uključivanje modula 'promise' koji će nam omogućiti korištenje funkcionalnosti obećanja u našem kodu.
- Sada možemo dodati funkciju 'then' našoj funkciji MongoClient.connect. Ono što ovo čini je da kada se uspostavi veza s bazom podataka, moramo izvršiti isječak koda definiran nakon toga.
- Naposljetku, definiramo naš isječak koda koji obavlja posao ažuriranja EmployeeName zaposlenika s imenom "Martin" u "Mohan".
Napomena: -
Ako sada provjerite sadržaj svog MongoDB baze podataka, otkrit ćete da ako postoji zapis s EmployeeName "Martin", on će se ažurirati na "Mohan".
Kako biste provjerili jesu li podaci pravilno umetnuti u bazu podataka, morate izvršiti sljedeće naredbe MongoDB
- Koristite EmployeeDB
- db.Employee.find({EmployeeName :Mohan })
Prva izjava osigurava da ste povezani s bazom podataka EmployeeDb. Drugi izraz traži zapis koji ima ime zaposlenika "Mohan".
Suočavanje s ugniježđenim obećanjima
Prilikom definiranja obećanja, potrebno je napomenuti da metoda “then” sama vraća obećanje. Dakle, u određenom smislu obećanja mogu biti ugniježđena ili lančano povezana jedno s drugim.
U donjem primjeru koristimo ulančavanje za definiranje 2 funkcije povratnog poziva, od kojih obje umeću zapis u MongoDB baza podataka.
(bilješke: Ulančavanje je koncept koji se koristi za međusobno povezivanje izvršenja metoda. Pretpostavimo da vaša aplikacija ima 2 metode pod nazivom 'methodA' i 'methodB'. A logika je bila takva da se 'methodB' treba pozvati nakon 'methodA', tada biste ulančali izvršenje na takav način da se 'methodB' poziva izravno nakon 'methodA.')
Ključna stvar koju treba primijetiti u ovom primjeru je da kod postaje čišći, čitljiv i održavan korištenjem 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 2 "then" klauzule koje se izvršavaju jedna za drugom. U prvoj then klauzuli, mi prosljeđujemo 'db' parametar koji sadrži našu vezu s bazom podataka. Zatim koristimo svojstvo zbirke 'db' veze za umetanje zapisa u kolekciju 'Zaposlenik'. Metoda 'insertOne' koristi se za umetanje stvarnog dokumenta u zbirku zaposlenika.
- Zatim koristimo 2nd zatim klauzula također za umetanje drugog zapisa u bazu podataka.
Ako sada provjerite sadržaj svog MongoDB baze podataka, naći ćete 2 zapisa umetnuta u MongoDB baza podataka.
Stvaranje prilagođenog obećanja
Prilagođeno obećanje može se stvoriti korištenjem modula čvora pod nazivom 'q.' Knjižnicu 'q' potrebno je preuzeti i instalirati pomoću upravitelja paketa čvorova. Nakon korištenja biblioteke 'q', može se pozvati metoda "denodeify" koja će uzrokovati da svaka funkcija postane funkcija koja vraća obećanje.
U donjem primjeru izradit ćemo jednostavnu funkciju pod nazivom "Dodaj" koja će zbrojiti 2 broja. Pretvorit ćemo ovu funkciju u funkciju za vraćanje obećanja.
Kada to učinimo, upotrijebit ćemo obećanje koje je vratila funkcija Dodaj za prikaz poruke u console.log.
Slijedimo korake u nastavku za stvaranje prilagođene funkcije za vraćanje obećanja.
Korak 1) Instaliranje NPM modula
Za korištenje 'q' unutar aplikacije Node JS potreban je modul 'q'. Da biste instalirali modul 'q', pokrenite donju naredbu
npm instaliraj 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 biblioteke 'q' pomoću ključne riječi require. Korištenjem ove biblioteke moći ćemo definirati bilo koju funkciju za povratni poziv.
- Stvaramo funkciju koja se zove Add koja će zbrajati 2 broja definirana u varijablama a i b. Zbroj ovih vrijednosti bit će pohranjen u varijabli c.
- Zatim koristimo biblioteku q za denodeificiranje (metoda koja se koristi za pretvaranje bilo koje funkcije u funkciju koja bi vratila obećanje) našu funkciju Dodaj ili na drugi način pretvorimo našu funkciju Dodaj u funkciju koja vraća obećanje.
- Sada pozivamo našu funkciju "Dodaj" i možemo dobiti povratnu obećanu vrijednost zbog prethodnog koraka koji smo izveli denodeificiranja funkcije Dodaj.
- Ključna riječ 'then' koristi se za specificiranje da se, ako je funkcija uspješno izvedena, prikazuje niz "Funkcija dodavanja dovršena" u console.log.
Kada se gornji kod pokrene, izlaz "Funkcija zbrajanja dovršena" bit će prikazan u console.log kao što je prikazano u nastavku.
Rezime
- Korištenje funkcija povratnog poziva u Node.js ima svoje nedostatke. Ponekad tijekom procesa razvoja, ugniježđena upotreba funkcija povratnog poziva može učiniti kod 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 node.js
- Obećanje je vrijednost koju vraća asinkrona funkcija da označi dovršetak obrade koju je izvršila asinkrona funkcija.
- Obećanja se mogu ugniježditi jedno u drugo kako bi kod izgledao bolje i lakše ga je održavati kada se asinkrona funkcija mora pozvati nakon druge asinkrone funkcije