Tutorial Node.js Promise
รn tutorialele anterioare, aศi fi vฤzut funcศii de apel invers care sunt utilizate pentru evenimente asincrone. Dar, uneori, funcศiile de apel invers pot deveni un coศmar atunci cรขnd รฎncep sฤ devinฤ imbricate, iar programul รฎncepe sฤ devinฤ lung ศi complex.
Ce sunt promisiunile?
รnainte de a รฎncepe cu promisiunile, sฤ revizuim mai รฎntรขi care sunt funcศiile โcallbackโ รฎn Node.js. Am vฤzut multe aceste funcศii de apel invers รฎn capitolele anterioare, aศa cฤ haideศi sฤ parcurgem rapid una dintre ele.
Exemplul de mai jos aratฤ un fragment de cod, care este utilizat pentru a vฤ conecta la un MongoDB baza de date ศi efectuaศi o operaศiune de actualizare a uneia dintre รฎnregistrฤrile din baza de date.
- รn codul de mai sus, partea funcศiei (err,db) este cunoscutฤ ca declaraศia unei funcศii anonime sau de apel invers. Cรขnd MongoClient creeazฤ o conexiune la MongoDB baza de date, va reveni la funcศia de apel invers dupฤ finalizarea operaศiunii de conectare. Deci, รฎntr-un anumit sens, operaศiunile de conectare au loc รฎn fundal ศi, cรขnd se terminฤ, apeleazฤ funcศia noastrฤ de apel invers. Amintiศi-vฤ cฤ acesta este unul dintre punctele cheie ale Node.js pentru a permite mai multor operaศiuni sฤ se รฎntรขmple simultan ศi, astfel, sฤ nu blocheze niciun utilizator sฤ efectueze o operaศiune.
- Al doilea bloc de cod este ceea ce este executat atunci cรขnd funcศia de apel invers este de fapt apelatฤ. Funcศia de apel invers doar actualizeazฤ o รฎnregistrare รฎn sistemul nostru MongoDB Bazฤ de date.
Deci, ce este o promisiune atunci? Ei bine, o promisiune este doar o รฎmbunฤtฤศire a funcศiilor de apel invers รฎn Node.js. รn timpul ciclului de viaศฤ al dezvoltฤrii, poate exista o situaศie รฎn care ar trebui sฤ imbricaศi mai multe funcศii de apel invers. Acest lucru poate deveni cam dezordonat ศi dificil de รฎntreศinut la un anumit moment รฎn timp. Pe scurt, o promisiune este o รฎmbunฤtฤศire a apelurilor inverse care urmฤreศte atenuarea acestor probleme.
Sintaxa de bazฤ a unei promisiuni este prezentatฤ mai jos;
var promise = doSomethingAync() promise.then(onFulfilled, onRejected)
- โdoSomethingAyncโ este orice funcศie de apel invers sau asincronฤ care efectueazฤ un fel de procesare.
- De data aceasta, la definirea apelului invers, existฤ o valoare care este returnatฤ numitฤ โpromisiuneโ.
- Cรขnd o promisiune este returnatฤ, aceasta poate avea 2 ieศiri. Aceasta este definitฤ de โclauza atunciโ. Fie operaศiunea poate fi un succes, care este notat de parametrul โonFulfilledโ. Sau poate avea o eroare care este indicatฤ de parametrul โonRejectedโ.
Notฤ: Deci aspectul cheie al unei promisiuni este valoarea de returnare. Nu existฤ un concept de valoare returnatฤ atunci cรขnd lucraศi cu apeluri normale รฎn Node.js. Datoritฤ valorii returnate, avem mai mult control asupra modului รฎn care poate fi definitฤ funcศia de apel invers.
รn urmฤtorul subiect, vom vedea un exemplu de promisiuni ศi modul รฎn care acestea beneficiazฤ de apeluri inverse.
Reapeluri la promisiuni
Acum sฤ ne uitฤm la un exemplu despre cum putem folosi โpromisiuniโ dintr-o aplicaศie Node.js. Pentru a utiliza promisiunile รฎntr-o aplicaศie Node.js, modulul โpromiseโ trebuie mai รฎntรขi descฤrcat ศi instalat.
Vom modifica apoi codul, aศa cum se aratฤ mai jos, care actualizeazฤ un Nume de angajat din colecศia โAngajatโ folosind promisiuni.
Pas 1) Instalarea modulelor NPM
Pentru a utiliza Promises dintr-o aplicaศie Node JS, este necesar modulul promise. Pentru a instala modulul promise, executaศi comanda de mai jos
Promisiunea de instalare npm
Pas 2) Modificaศi codul pentru a include promisiuni
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 Explicaลฃie:-
- Prima parte este sฤ includem modulul โpromisiuneโ, care ne va permite sฤ folosim funcศionalitatea de promisiune din codul nostru.
- Acum putem adฤuga funcศia โatunciโ la funcศia MongoClient.connect. Deci, ceea ce face este cฤ atunci cรขnd conexiunea este stabilitฤ la baza de date, trebuie sฤ executฤm fragmentul de cod definit ulterior.
- รn cele din urmฤ, definim fragmentul nostru de cod care face munca de actualizare EmployeeName al angajatului cu numele โMartinโ la โMohanโ.
Notฤ:-
Dacฤ verificaศi acum conศinutul dvs MongoDB baza de date, veศi descoperi cฤ, dacฤ existฤ o รฎnregistrare cu EmployeeName de โMartinโ, aceasta va fi actualizatฤ la โMohanโ.
Pentru a verifica dacฤ datele au fost introduse corect รฎn baza de date, trebuie sฤ executaศi urmฤtoarele comenzi รฎn MongoDB
- Utilizaศi EmployeeDB
- db.Employee.find({EmployeeName :Mohan })
Prima declaraศie asigurฤ cฤ sunteศi conectat la baza de date EmployeeDb. A doua declaraศie cautฤ รฎnregistrarea care are numele angajatului โMohanโ.
A face cu promisiuni imbricate
La definirea promisiunilor, trebuie remarcat faptul cฤ metoda โatunciโ รฎn sine returneazฤ o promisiune. Deci, รฎntr-un fel, promisiunile pot fi imbricate sau legate รฎntre ele.
รn exemplul de mai jos, folosim รฎnlฤnศuirea pentru a defini 2 funcศii de apel invers, ambele inserรขnd o รฎnregistrare รฎn MongoDB Bazฤ de date.
(notiศe: รnlฤnศuirea este un concept folosit pentru a lega execuศia metodelor รฎntre ele. Sฤ presupunem cฤ aplicaศia dvs. a avut 2 metode numite โmethodAโ ศi โmethodBโ. ศi logica era de aศa naturฤ รฎncรขt โmethodBโ ar trebui sฤ fie apelatฤ dupฤ โmethodAโ, apoi aศi รฎnlฤnศui execuศia รฎn aศa fel รฎncรขt โmethodBโ sฤ fie apelatฤ direct dupฤ โmethodAโ.)
Lucrul cheie de remarcat รฎn acest exemplu este cฤ codul devine mai curat, mai uศor de citit ศi de รฎntreศinut prin utilizarea promisiunilor imbricate.
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 Explicaลฃie:-
- Acum definim 2 clauze โatunciโ care se executฤ una dupฤ alta. รn prima clauzฤ apoi, trecem parametrul โdbโ care conศine conexiunea noastrฤ la baza de date. Apoi folosim proprietatea de colecศie a conexiunii โdbโ pentru a insera รฎnregistrฤri รฎn colecศia โAngajatโ. Metoda โinsertOneโ este folositฤ pentru a insera documentul real รฎn colecศia Employee.
- Apoi folosim 2nd apoi clauzฤ ศi pentru a introduce o altฤ รฎnregistrare รฎn baza de date.
Dacฤ verificaศi acum conศinutul dvs MongoDB baza de date, veศi gฤsi cele 2 รฎnregistrฤri introduse รฎn MongoDB Bazฤ de date.
Crearea unei promisiuni personalizate
O promisiune personalizatฤ poate fi creatฤ utilizรขnd un modul nod numit โq.โ Biblioteca โqโ trebuie descฤrcatฤ ศi instalatฤ folosind managerul de pachete nod. Dupฤ utilizarea bibliotecii โqโ, poate fi apelatฤ metoda โdenodeifyโ, ceea ce va face ca orice funcศie sฤ devinฤ o funcศie care returneazฤ o promisiune.
รn exemplul de mai jos, vom crea o funcศie simplฤ numitฤ โAdฤugaศiโ care va adฤuga 2 numere. Vom converti aceastฤ funcศie รฎntr-o funcศie pentru a returna o promisiune.
Odatฤ ce este fฤcut, vom folosi promisiunea returnatฤ de funcศia Adฤugare pentru a afiศa un mesaj รฎn console.log.
Sฤ urmฤm paศii de mai jos pentru a crea funcศia noastrฤ personalizatฤ pentru a returna o promisiune.
Pas 1) Instalarea modulelor NPM
Pentru a utiliza โqโ dintr-o aplicaศie Node JS, este necesar modulul โqโ. Pentru a instala modulul โqโ, rulaศi comanda de mai jos
npm install q
Pas 2) Definiศi urmฤtorul cod care va fi folosit pentru a crea promisiunea personalizatฤ.
Code Explicaลฃie:-
- Primul bit este sฤ includeศi biblioteca โqโ folosind cuvรขntul cheie require. Folosind aceastฤ bibliotecฤ, vom putea defini orice funcศie pentru a returna un apel invers.
- Creฤm o funcศie numitฤ Adaugฤ care va adฤuga 2 numere definite รฎn variabilele a ศi b. Suma acestor valori va fi stocatฤ รฎn variabila c.
- Apoi folosim biblioteca q pentru a denodeifica (metoda folositฤ pentru a converti orice funcศie รฎntr-o funcศie care ar returna o promisiune) funcศia noastrฤ Adฤugare sau, รฎn alt mod, a converti funcศia Adฤugare รฎntr-o funcศie care returneazฤ o promisiune.
- Acum numim funcศia noastrฤ โAdฤugaศiโ ศi putem obศine o valoare de promisiune de returnare din cauza pasului anterior pe care l-am efectuat de denodeificare a funcศiei Add.
- Cuvรขntul cheie โthenโ este folosit pentru a specifica faptul cฤ, dacฤ funcศia este executatฤ cu succes, atunci afiศaศi ศirul โFuncศie de adฤugare finalizatฤโ รฎn console.log.
Cรขnd se ruleazฤ codul de mai sus, ieศirea โFuncศia de adฤugare finalizatฤโ va fi afiศatฤ รฎn console.log, aศa cum se aratฤ mai jos.
Rezumat
- Utilizarea funcศiilor de apel invers รฎn Node.js are dezavantajele sale. Uneori, รฎn timpul procesului de dezvoltare, utilizarea imbricatฤ a funcศiilor de apel invers poate face codul mai dezordonat ศi dificil de รฎntreศinut.
- Cele mai multe dintre problemele cu funcศiile de apel invers imbricate pot fi atenuate prin utilizarea de promisiuni ศi generatoare รฎn node.js
- O Promisiune este o valoare returnatฤ de o funcศie asincronฤ pentru a indica finalizarea procesฤrii efectuate de funcศia asincronฤ.
- Promisiunile pot fi imbricate unele รฎn altele pentru a face codul sฤ arate mai bine ศi mai uศor de menศinut atunci cรขnd o funcศie asincronฤ trebuie apelatฤ dupฤ o altฤ funcศie asincronฤ





