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

Code Forklaring:-

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

Code Forklaring:-

  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

Code Forklaring:-

  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

Opsummer dette indlรฆg med: