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.

Promisiunea Node.js

  1. รŽ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.
  2. 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

Reapeluri la Promise

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:-

  1. Prima parte este sฤƒ includem modulul โ€žpromisiuneโ€, care ne va permite sฤƒ folosim funcศ›ionalitatea de promisiune din codul nostru.
  2. 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.
  3. รŽ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

  1. Utilizaศ›i EmployeeDB
  2. 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.

Confruntarea cu promisiunile 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:-

  1. 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.
  2. 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ฤƒ.

Crearea unei promisiune personalizatฤƒ

Code Explicaลฃie:-

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Crearea unei promisiune personalizatฤƒ

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ฤƒ

Rezumaศ›i aceastฤƒ postare cu: