Node.js Promise-opplæring
I tidligere opplæringsprogrammer ville du ha sett tilbakeringingsfunksjoner som brukes for asynkrone hendelser. Men noen ganger kan tilbakeringingsfunksjoner bli et mareritt når de begynner å bli nestet, og programmet begynner å bli langt og komplekst.
Hva er løfter?
Før vi starter med løfter, la oss først se på hva som er "tilbakeringings"-funksjoner i Node.js. Vi har sett disse tilbakeringingsfunksjonene mye i de forrige kapitlene, så la oss raskt gå gjennom en av dem.
Eksemplet nedenfor viser en kodebit som brukes til å koble til en MongoDB database og utføre en oppdateringsoperasjon på en av postene i databasen.
- I koden ovenfor er delen av funksjonen (err,db) kjent som erklæringen om en anonym funksjon eller tilbakeringingsfunksjon. Når MongoClient oppretter en forbindelse til MongoDB databasen, vil den gå tilbake til tilbakeringingsfunksjonen når tilkoblingsoperasjonen er fullført. Så på en måte skjer tilkoblingsoperasjonene i bakgrunnen, og når det er gjort, kaller det tilbakeringingsfunksjonen vår. Husk at dette er et av nøkkelpunktene til Node.js for å tillate mange operasjoner å skje samtidig og dermed ikke blokkere noen bruker fra å utføre en operasjon.
- Den andre kodeblokken er det som blir utført når tilbakeringingsfunksjonen faktisk kalles. Tilbakeringingsfunksjonen oppdaterer bare én post i vår MongoDB database.
Så hva er et løfte da? Vel, et løfte er bare en forbedring av tilbakeringingsfunksjoner i Node.js. I løpet av utviklingslivssyklusen kan det være et tilfelle hvor du må legge flere tilbakeringingsfunksjoner sammen. Dette kan bli litt rotete og vanskelig å vedlikeholde på et bestemt tidspunkt. Kort sagt, et løfte er en forbedring av tilbakeringinger som ser ut til å lindre disse problemene.
Den grunnleggende syntaksen til et løfte er vist nedenfor;
var promise = doSomethingAync() promise.then(onFulfilled, onRejected)
- "doSomethingAync" er enhver tilbakeringing eller asynkron funksjon som utfører en form for behandling.
- Denne gangen, når du definerer tilbakeringingen, er det en verdi som returneres kalt et "løfte."
- Når et løfte returneres, kan det ha 2 utganger. Dette er definert av 'då-klausulen'. Enten kan operasjonen være en suksess som er angitt med parameteren 'onFulfilled'. Eller det kan ha en feil som er angitt med parameteren 'onRejected'.
OBS: Så nøkkelaspektet ved et løfte er returverdien. Det er ikke noe konsept for en returverdi når du arbeider med normale tilbakeringinger i Node.js. På grunn av returverdien har vi mer kontroll over hvordan tilbakeringingsfunksjonen kan defineres.
I neste emne vil vi se et eksempel på løfter og hvordan de drar nytte av tilbakeringinger.
Tilbakeringing til løfter
La oss nå se på et eksempel på hvordan vi kan bruke "løfter" fra en Node.js-applikasjon. For å bruke løfter i en Node.js-applikasjon, må 'løfte'-modulen først lastes ned og installeres.
Vi vil deretter endre koden vår som vist nedenfor, som oppdaterer et ansattnavn i 'Ansatt'-samlingen ved å bruke løfter.
Trinn 1) Installere NPM-modulene
For å bruke Promises fra en Node JS-applikasjon, kreves løftemodulen. For å installere løftemodulen, kjør kommandoen nedenfor
npm installeringsløfte
Trinn 2) Endre koden for å inkludere 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:-
- Den første delen er å inkludere 'løfte'-modulen som vil tillate oss å bruke løftefunksjonaliteten i koden vår.
- Vi kan nå legge til 'da'-funksjonen til vår MongoClient.connect-funksjon. Så det dette gjør er at når tilkoblingen er opprettet til databasen, må vi kjøre kodebiten definert deretter.
- Til slutt definerer vi vår kodebit som gjør jobben med å oppdatere EmployeeName til den ansatte med navnet "Martin" til "Mohan".
Merk: -
Hvis du nå sjekker innholdet i din MongoDB database, vil du finne at hvis en post med EmployeeName av "Martin" eksisterer, vil den bli oppdatert til "Mohan."
For å kontrollere at dataene er satt inn riktig i databasen, må du utføre følgende kommandoer i MongoDB
- Bruk EmployeeDB
- db.Employee.find({EmployeeName :Mohan })
Den første setningen sikrer at du er koblet til EmployeeDb-databasen. Den andre setningen søker etter posten som har ansattnavnet "Mohan".
Håndtering av nestede løfter
Når du definerer løfter, må det bemerkes at "da"-metoden i seg selv returnerer et løfte. Så på en måte kan løfter være nestet eller lenket til hverandre.
I eksemplet nedenfor bruker vi kjeding til å definere 2 tilbakeringingsfunksjoner, som begge setter inn en post i MongoDB database.
(Merknader: Kjeding er et konsept som brukes for å koble utførelse av metoder til hverandre. Tenk deg at søknaden din hadde to metoder kalt 'metodeA' og 'metodeB'. Og logikken var slik at 'metodeB' skulle kalles etter 'metodeA', så ville du lenke utførelsen på en slik måte at 'metodeB' blir kalt direkte etter 'metodeA.')
Det viktigste å merke seg i dette eksemplet er at koden blir renere, lesbar og vedlikeholdbar ved å bruke nestede 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:-
- Vi definerer nå 2 "da"-klausuler som blir utført etter hverandre. I den første klausulen sender vi 'db'-parameteren som inneholder databasetilkoblingen vår. Vi bruker da samlingsegenskapen til 'db'-forbindelsen for å sette inn poster i 'Ansatt'-samlingen. 'insertOne'-metoden brukes til å sette inn selve dokumentet i ansattsamlingen.
- Vi bruker da 2nd deretter klausul også for å sette inn en annen post i databasen.
Hvis du nå sjekker innholdet i din MongoDB databasen, vil du finne de 2 postene satt inn i MongoDB database.
Opprette et tilpasset løfte
Et tilpasset løfte kan opprettes ved å bruke en nodemodul kalt 'q.' 'q'-biblioteket må lastes ned og installeres ved hjelp av nodepakkebehandlingen. Etter å ha brukt 'q'-biblioteket, kan metoden "denodeify" kalles som vil føre til at enhver funksjon blir en funksjon som returnerer et løfte.
I eksemplet nedenfor vil vi lage en enkel funksjon kalt "Legg til" som vil legge til 2 tall. Vi vil konvertere denne funksjonen til en funksjon for å returnere et løfte.
Når det er gjort, vil vi bruke løftet som returneres av Add-funksjonen for å vise en melding i console.log.
La oss følge trinnene nedenfor for å lage vår egendefinerte funksjon for å returnere et løfte.
Trinn 1) Installere NPM-modulene
For å bruke 'q' fra en Node JS-applikasjon, kreves 'q'-modulen. For å installere 'q'-modulen, kjør kommandoen nedenfor
npm installer q
Trinn 2) Definer følgende kode som skal brukes til å lage det tilpassede løftet.
Kodeforklaring:-
- Den første biten er å inkludere 'q'-biblioteket ved å bruke nøkkelordet require. Ved å bruke dette biblioteket vil vi kunne definere hvilken som helst funksjon for å returnere en tilbakeringing.
- Vi lager en funksjon kalt Add som vil legge til 2 tall definert i variablene a og b. Summen av disse verdiene vil bli lagret i variabel c.
- Vi bruker deretter q-biblioteket til å denodeifisere (metoden som brukes til å konvertere en funksjon til en funksjon som vil returnere et løfte) vår Add-funksjon eller på annen måte konvertere Add-funksjonen vår til en funksjon som returnerer et løfte.
- Vi kaller nå "Legg til"-funksjonen vår og er i stand til å få en returløfteverdi på grunn av det forrige trinnet vi utførte med å denodeifisere Add-funksjonen.
- Nøkkelordet 'da' brukes spesifiser at hvis funksjonen utføres vellykket, så vis strengen "Addition function completed" i console.log.
Når koden ovenfor kjøres, vil utdata "Addition function completed" vises i console.log som vist nedenfor.
Oppsummering
- Å bruke tilbakeringingsfunksjoner i Node.js har sine ulemper. Noen ganger under utviklingsprosessen kan den nestede bruken av tilbakeringingsfunksjoner gjøre koden mer rotete og vanskelig å vedlikeholde.
- De fleste problemene med nestede tilbakeringingsfunksjoner kan reduseres ved bruk av løfter og generatorer i node.js
- Et løfte er en verdi som returneres av en asynkron funksjon for å indikere fullføringen av behandlingen utført av den asynkrone funksjonen.
- Løfter kan nestes i hverandre for å få koden til å se bedre og enklere å vedlikeholde når en asynkron funksjon må kalles opp etter en annen asynkron funksjon