Node.js Promise Tutorial

I tidligere tutorials ville du have set tilbagekaldsfunktioner, som bruges til asynkrone hændelser. Men nogle gange kan tilbagekaldsfunktioner blive et mareridt, når de begynder at blive indlejrede, og programmet begynder at blive langt og komplekst.

Hvad er løfter?

Inden vi starter med løfter, lad os først gense, hvad der er "tilbagekald"-funktioner i Node.js. Vi har set disse tilbagekaldsfunktioner meget i de foregående kapitler, så lad os hurtigt gennemgå en af ​​dem.

Eksemplet nedenfor viser et kodestykke, som bruges til at oprette forbindelse til en MongoDB database og udføre en opdateringshandling på en af ​​posterne i databasen.

Node.js Promise

  1. I ovenstående kode er delen af ​​funktionen(err,db) kendt som erklæringen om en anonym eller tilbagekaldsfunktion. Når MongoClienten opretter en forbindelse til MongoDB database, vil den vende tilbage til tilbagekaldsfunktionen, når forbindelsesoperationen er fuldført. Så på en måde sker forbindelsesoperationerne i baggrunden, og når det er færdigt, kalder det vores tilbagekaldsfunktion. Husk at dette er et af nøglepunkterne i Node.js for at tillade mange operationer at ske samtidigt og dermed ikke blokere nogen bruger i at udføre en operation.
  2. Den anden kodeblok er det, der udføres, når tilbagekaldsfunktionen faktisk kaldes. Tilbagekaldsfunktionen opdaterer blot én post i vores MongoDB databasen.

Så hvad er et løfte så? Nå, et løfte er blot en forbedring af tilbagekaldsfunktioner i Node.js. I løbet af udviklingens livscyklus kan der være et tilfælde, hvor du bliver nødt til at indlejre flere tilbagekaldsfunktioner sammen. Dette kan blive lidt rodet og svært at vedligeholde på et bestemt tidspunkt. Kort sagt er et løfte en forbedring af tilbagekald, der sigter mod at afhjælpe disse problemer.

Den grundlæggende syntaks for et løfte er vist nedenfor;

var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
  • "doSomethingAync" er enhver tilbagekaldsfunktion eller asynkron funktion, der udfører en form for behandling.
  • Denne gang, når tilbagekaldet defineres, er der en værdi, som returneres kaldet et "løfte".
  • Når et løfte returneres, kan det have 2 udgange. Dette er defineret af "then-klausulen". Enten kan operationen blive en succes, hvilket er angivet med parameteren 'onFulfilled'. Eller den kan have en fejl, som er angivet med parameteren 'onRejected'.

Bemærk: Så det vigtigste aspekt ved et løfte er returværdien. Der er ikke noget koncept for en returværdi, når man arbejder med normale tilbagekald i Node.js. På grund af returværdien har vi mere kontrol over, hvordan tilbagekaldsfunktionen kan defineres.

I det næste emne vil vi se et eksempel på løfter, og hvordan de drager fordel af tilbagekald.

Tilbagekald til løfter

Lad os nu se på et eksempel på, hvordan vi kan bruge "løfter" fra en Node.js-applikation. For at kunne bruge løfter i en Node.js-applikation, skal 'løfte'-modulet først downloades og installeres.

Vi vil derefter ændre vores kode som vist nedenfor, som opdaterer et medarbejdernavn i 'Medarbejder'-samlingen ved at bruge løfter.

Trin 1) Installation af NPM-modulerne

For at bruge Promises fra en Node JS-applikation kræves løftemodulet. For at installere løftemodulet skal du køre kommandoen nedenfor

npm installation løfte

Trin 2) Rediger koden til at inkludere løfter

Tilbagekald til løfter

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"
            }
        });
    }); 

Kodeforklaring:-

  1. Den første del er at inkludere 'løfte'-modulet, som giver os mulighed for at bruge løftefunktionaliteten i vores kode.
  2. Vi kan nu tilføje 'da'-funktionen til vores MongoClient.connect-funktion. Så hvad dette gør er, at når forbindelsen er etableret til databasen, skal vi udføre kodestykket, der er defineret derefter.
  3. Til sidst definerer vi vores kodestykke, som udfører arbejdet med at opdatere medarbejderens EmployeeName med navnet "Martin" til "Mohan".

Bemærk: -

Hvis du nu tjekker indholdet af din MongoDB database, vil du opdage, at hvis en post med EmployeeName af "Martin" eksisterer, vil den blive opdateret til "Mohan."

For at kontrollere, at dataene er blevet korrekt indsat i databasen, skal du udføre følgende kommandoer i MongoDB

  1. Brug EmployeeDB
  2. db.Employee.find({EmployeeName :Mohan })

Den første erklæring sikrer, at du er forbundet til EmployeeDb-databasen. Den anden erklæring søger efter posten, som har medarbejdernavnet "Mohan".

Håndtering af indlejrede løfter

Når du definerer løfter, skal det bemærkes, at "dengang"-metoden i sig selv returnerer et løfte. Så på en måde kan løfter være indlejret eller lænket til hinanden.

I eksemplet nedenfor bruger vi kæde til at definere 2 tilbagekaldsfunktioner, som begge indsætter en post i MongoDB databasen.

(Bemærk: Kædning er et begreb, der bruges til at forbinde udførelse af metoder til hinanden. Antag, hvis din ansøgning havde 2 metoder kaldet 'metodeA' og 'metodeB'. Og logikken var sådan, at 'metodeB' skulle kaldes efter 'metodeA', så ville du kæde udførelsen på en sådan måde, at 'metodeB' bliver kaldt direkte efter 'metodeA').

Det vigtigste at bemærke i dette eksempel er, at koden bliver renere, læsbar og vedligeholdelig ved at bruge indlejrede løfter.

Håndtering af indlejrede løfter

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"
        })
    })
});

Kodeforklaring:-

  1. Vi definerer nu 2 "dengang"-klausuler, som bliver udført efter hinanden. I den første klausul sender vi parameteren 'db', som indeholder vores databaseforbindelse. Vi bruger derefter indsamlingsegenskaben for 'db'-forbindelsen til at indsætte poster i 'Medarbejder'-samlingen. Metoden 'insertOne' bruges til at indsætte selve dokumentet i medarbejdersamlingen.
  2. Så bruger vi 2nd derefter klausul også for at indsætte en anden post i databasen.

Hvis du nu tjekker indholdet af din MongoDB database, vil du finde de 2 post'er indsat i MongoDB databasen.

Oprettelse af et tilpasset løfte

Et brugerdefineret løfte kan oprettes ved at bruge et nodemodul kaldet 'q.' 'q'-biblioteket skal downloades og installeres ved hjælp af node-pakkehåndteringen. Efter brug af 'q'-biblioteket kan metoden "denodeify" kaldes, hvilket vil få enhver funktion til at blive en funktion, der returnerer et løfte.

I eksemplet nedenfor vil vi oprette en simpel funktion kaldet "Tilføj", som tilføjer 2 tal. Vi vil konvertere denne funktion til en funktion for at returnere et løfte.

Når det er gjort, vil vi bruge løftet returneret af Tilføj-funktionen til at vise en besked i console.log.

Lad os følge nedenstående trin for at oprette vores brugerdefinerede funktion for at returnere et løfte.

Trin 1) Installation af NPM-modulerne

For at bruge 'q' fra en Node JS-applikation kræves 'q'-modulet. For at installere 'q'-modulet skal du køre kommandoen nedenfor

npm installer q

Trin 2) Definer følgende kode, som vil blive brugt til at oprette det tilpassede løfte.

Oprettelse af et tilpasset løfte

Kodeforklaring:-

  1. Den første bit er at inkludere 'q'-biblioteket ved at bruge nøgleordet require. Ved at bruge dette bibliotek vil vi være i stand til at definere enhver funktion for at returnere et tilbagekald.
  2. Vi laver en funktion kaldet Add, som tilføjer 2 tal defineret i variable a og b. Summen af ​​disse værdier vil blive gemt i variabel c.
  3. Vi bruger derefter q-biblioteket til at denodeificere (metoden, der bruges til at konvertere enhver funktion til en funktion, der ville returnere et løfte) vores Tilføj-funktion eller på anden måde konvertere vores Tilføj-funktion til en funktion, der returnerer et løfte.
  4. Vi kalder nu vores "Tilføj"-funktion og er i stand til at få en returløfteværdi på grund af det foregående trin, vi udførte med at denodeify Add-funktionen.
  5. Nøgleordet 'then' bruges til at angive, at hvis funktionen udføres med succes, så vis strengen "Addition function completed" i console.log.

Når ovenstående kode køres, vil outputtet "Addition function completed" blive vist i console.log som vist nedenfor.

Oprettelse af et tilpasset løfte

Resumé

  • Brug af tilbagekaldsfunktioner i Node.js har sine ulemper. Nogle gange under udviklingsprocessen kan den indlejrede brug af tilbagekaldsfunktioner gøre koden mere rodet og svær at vedligeholde.
  • De fleste problemer med indlejrede tilbagekaldsfunktioner kan afhjælpes ved brug af løfter og generatorer i node.js
  • Et løfte er en værdi, der returneres af en asynkron funktion for at angive fuldførelsen af ​​behandlingen udført af den asynkrone funktion.
  • Løfter kan indlejres i hinanden for at få kode til at se bedre ud og nemmere at vedligeholde, når en asynkron funktion skal kaldes efter en anden asynkron funktion