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" } }); });
Explicația codului: -
- 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" }) }) });
Explicația codului: -
- 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ă.
Explicația codului: -
- 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ă