I tidigare handledning hade du sett återuppringningsfunktioner som används för asynkrona händelser. Men ibland kan återuppringningsfunktioner bli en mardröm när de börjar bli kapslade och programmet börjar bli långt och komplext.
I den här handledningen lär du dig-
- Vad är löften?
- Återuppringningar till löften
- Att hantera kapslade löften
- Skapa ett anpassat löfte
Vad är löften?
Innan vi börjar med löften, låt oss först se över vad som är "callback" -funktioner i Node.js. Vi har sett dessa återuppringningsfunktioner mycket i de föregående kapitlen, så låt oss snabbt gå igenom en av dem.
I exemplet nedan visas ett kodavsnitt som används för att ansluta till en MongoDB-databas och utföra en uppdateringsåtgärd på en av posterna i databasen.
-
I ovanstående kod är den del av funktionen (err, db) känd som deklaration av en anonym eller återuppringningsfunktion. När MongoClient skapar en anslutning till MongoDB-databasen återgår den till återuppringningsfunktionen när anslutningsfunktionen är klar. Så på sätt och vis händer anslutningsoperationerna i bakgrunden, och när det är klart kallar det vår återuppringningsfunktion. Kom ihåg att detta är en av de viktigaste punkterna i Node.js så att många operationer kan ske samtidigt och därmed inte blockera någon användare från att utföra en operation.
-
Det andra kodblocket är vad som körs när återuppringningsfunktionen faktiskt anropas. Återuppringningsfunktionen uppdaterar bara en post i vår MongoDB-databas.
Så vad är då ett löfte? Tja, ett löfte är bara en förbättring av återuppringningsfunktioner i Node.js. Under utvecklingslivscykeln kan det finnas en instans där du måste bygga flera återuppringningsfunktioner tillsammans. Detta kan bli lite rörigt och svårt att underhålla vid en viss tidpunkt. Kort sagt är ett löfte en förbättring av återuppringningar som syftar till att lindra dessa problem.
Den grundläggande syntaxen för ett löfte visas nedan;
var promise = doSomethingAync()promise.then(onFulfilled, onRejected)
- "doSomethingAync" är någon återuppringning eller asynkron funktion som gör någon form av bearbetning.
- Den här gången, när du definierar återuppringningen, finns det ett värde som returneras kallat ett "löfte".
- När ett löfte returneras kan det ha två utgångar. Detta definieras av 'då klausulen'. Antingen kan operationen bli en framgång som betecknas med parametern "onFulfilled". Eller så kan det ha ett fel som betecknas med parametern 'onRejected'.
Obs! Så nyckelaspekten av ett löfte är returvärdet. Det finns inget koncept för ett returvärde när du arbetar med normala återuppringningar i Node.js. På grund av returvärdet har vi mer kontroll över hur återuppringningsfunktionen kan definieras.
I nästa ämne kommer vi att se ett exempel på löften och hur de drar nytta av återuppringningar.
Återuppringningar till löften
Låt oss nu titta på ett exempel på hur vi kan använda "löften" från en Node.js-applikation. För att kunna använda löften i en Node.js-applikation måste modulen 'love' först laddas ner och installeras.
Vi kommer sedan att ändra vår kod som visas nedan, som uppdaterar ett anställdnamn i samlingen 'Anställd' genom att använda löften.
Steg 1) Installera NPM-modulerna
För att kunna använda Promises inifrån en Node JS-applikation krävs löftemodulen. För att installera löfte modulen, kör kommandot nedan
npm installera löfte
Steg 2) Ändra koden så att den innehåller löften
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"}});});
Kodförklaring: -
- Den första delen är att inkludera "lovande" -modulen som gör att vi kan använda löftetfunktionen i vår kod.
- Vi kan nu lägga till "då" -funktionen till vår MongoClient.connect-funktion. Så vad detta gör är att när anslutningen upprättas till databasen måste vi köra kodavsnittet som definieras därefter.
- Slutligen definierar vi vårt kodavsnitt som gör arbetet med att uppdatera den anställdes anställd med namnet "Martin" till "Mohan".
Notera:-
Om du nu kontrollerar innehållet i din MongoDB-databas kommer du att upptäcka att om det finns en post med anställd av "Martin" kommer den att uppdateras till "Mohan."
För att kontrollera att data har införts ordentligt i databasen måste du utföra följande kommandon i MongoDB
- Använd EmployeeDB
- db.Employee.find ({EmployeeName: Mohan})
Det första uttalandet säkerställer att du är ansluten till databasen EmployeeDb. Det andra uttalandet söker efter posten som har anställdes namn "Mohan".
Att hantera kapslade löften
När man definierar löften, måste man notera att "då" -metoden i sig ger tillbaka ett löfte. Så på sätt och vis kan löften vara kapslade eller kedjade till varandra.
I exemplet nedan använder vi chaining för att definiera två återuppringningsfunktioner, som båda infogar en post i MongoDB-databasen.
( Obs : Kedjning är ett begrepp som används för att länka körning av metoder till varandra. Antag att om din applikation hade två metoder som kallades 'metod A' och 'metod B.' Och logiken var sådan att 'metod B' skulle kallas efter 'metod A', ' då skulle du kedja körningen på ett sådant sätt att 'metodB' kallas direkt efter 'metod A.'
Det viktigaste att notera i detta exempel är att koden blir renare, läsbar och underhållbar genom att använda kapslade löften.
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"})})});
Kodförklaring: -
- Vi definierar nu två "då" -klausuler som körs efter varandra. I den första klausulen skickar vi parametern 'db' som innehåller vår databasanslutning. Vi använder sedan samlingsegenskapen för 'db' -anslutningen för att infoga poster i samlingen 'Anställd'. Metoden 'insertOne' används för att infoga det faktiska dokumentet i medarbetarsamlingen.
- Vi använder sedan den andra sedan-klausulen också för att infoga en annan post i databasen.
Om du nu kontrollerar innehållet i din MongoDB-databas hittar du de 2 posterna infogade i MongoDB-databasen.
Skapa ett anpassat löfte
Ett anpassat löfte kan skapas med hjälp av en nodmodul som heter 'q'. Biblioteket 'q' måste laddas ner och installeras med hjälp av nodpakethanteraren. Efter att ha använt "q" -biblioteket kan metoden "denodeify" anropas, vilket kommer att leda till att varje funktion blir en funktion som returnerar ett löfte.
I exemplet nedan skapar vi en enkel funktion som heter "Lägg till" som lägger till två nummer. Vi kommer att konvertera den här funktionen till en funktion för att returnera ett löfte.
När det är gjort kommer vi att använda löftet som returneras av Lägg till-funktionen för att visa ett meddelande i console.log.
Låt oss följa stegen nedan för att skapa vår anpassade funktion för att returnera ett löfte.
Steg 1) Installera NPM-modulerna
För att använda 'q' från en Node JS-applikation krävs 'q' -modulen. För att installera 'q-modulen, kör du kommandot nedan
npm installera q
Steg 2) Definiera följande kod som kommer att användas för att skapa det anpassade löftet.
Kodförklaring: -
- Den första biten är att inkludera 'q' -biblioteket med hjälp av önskat nyckelord. Genom att använda detta bibliotek kommer vi att kunna definiera vilken funktion som helst för att returnera en återuppringning.
- Vi skapar en funktion som heter Add som lägger till 2 nummer definierade i variablerna a och b. Summan av dessa värden lagras i variabel c.
- Vi använder sedan q-biblioteket för att avkoda (metoden som används för att konvertera en funktion till en funktion som skulle returnera ett löfte) vår Lägg-funktion eller på annat sätt konvertera vår Lägg till-funktion till en funktion som returnerar ett löfte.
- Vi kallar nu vår "Lägg till" -funktion och kan få ett returlöftevärde på grund av det tidigare steget vi gjorde för att avkoda funktionen Lägg till.
- Nyckelordet 'då' används anger att om funktionen körs framgångsrikt så visar strängen "Tilläggsfunktionen slutförd" i console.log.
När koden ovan körs visas utdata "Tilläggsfunktionen slutförd" i console.log som visas nedan.
Sammanfattning
- Att använda återuppringningsfunktioner i Node.js har dess nackdelar. Ibland under utvecklingsprocessen kan den kapslade användningen av återuppringningsfunktioner göra koden messierare och svår att underhålla.
- De flesta av problemen med kapslade återuppringningsfunktioner kan mildras med användning av löften och generatorer i node.js
- Ett löfte är ett värde som returneras av en asynkron funktion för att indikera att behandlingen har utförts av den asynkrona funktionen.
- Löften kan vara kapslade i varandra för att få koden att se bättre ut och lättare att upprätthålla när en asynkron funktion behöver anropas efter en annan asynkron funktion