In früheren Tutorials hätten Sie Rückruffunktionen gesehen, die für asynchrone Ereignisse verwendet werden. Aber manchmal können Rückruffunktionen zu einem Albtraum werden, wenn sie verschachtelt werden und das Programm lang und komplex wird.
In diesem Tutorial lernen Sie:
- Was sind Versprechen?
- Rückrufe auf Versprechen
- Umgang mit verschachtelten Versprechungen
- Erstellen eines benutzerdefinierten Versprechens
Was sind Versprechen?
Bevor wir mit Versprechungen beginnen, schauen wir uns zunächst die "Rückruf" -Funktionen in Node.js an. Wir haben diese Rückruffunktionen in den vorherigen Kapiteln häufig gesehen. Lassen Sie uns daher schnell eine davon durchgehen.
Das folgende Beispiel zeigt ein Code-Snippet, mit dem eine Verbindung zu einer MongoDB-Datenbank hergestellt und ein Aktualisierungsvorgang für einen der Datensätze in der Datenbank ausgeführt wird.
-
Im obigen Code wird der Teil der Funktion (err, db) als Deklaration einer anonymen oder Rückruffunktion bezeichnet. Wenn der MongoClient eine Verbindung zur MongoDB-Datenbank herstellt, kehrt er nach Abschluss des Verbindungsvorgangs zur Rückruffunktion zurück. In gewisser Weise finden die Verbindungsvorgänge im Hintergrund statt, und wenn dies erledigt ist, wird unsere Rückruffunktion aufgerufen. Denken Sie daran, dass dies einer der wichtigsten Punkte von Node.js ist, damit viele Vorgänge gleichzeitig ausgeführt werden können und somit kein Benutzer daran gehindert wird, einen Vorgang auszuführen.
-
Der zweite Codeblock wird ausgeführt, wenn die Rückruffunktion tatsächlich aufgerufen wird. Die Rückruffunktion aktualisiert nur einen Datensatz in unserer MongoDB-Datenbank.
Was ist dann ein Versprechen? Ein Versprechen ist nur eine Verbesserung der Rückruffunktionen in Node.js. Während des Entwicklungslebenszyklus kann es vorkommen, dass Sie mehrere Rückruffunktionen zusammenschachteln müssen. Dies kann zu einem bestimmten Zeitpunkt etwas chaotisch und schwierig zu warten sein. Kurz gesagt, ein Versprechen ist eine Verbesserung von Rückrufen, die darauf abzielen, diese Probleme zu lindern.
Die grundlegende Syntax eines Versprechens ist unten dargestellt.
var promise = doSomethingAync()promise.then(onFulfilled, onRejected)
- "doSomethingAync" ist eine Rückruf- oder asynchrone Funktion, die eine Art Verarbeitung ausführt.
- Dieses Mal wird beim Definieren des Rückrufs ein Wert zurückgegeben, der als "Versprechen" bezeichnet wird.
- Wenn ein Versprechen zurückgegeben wird, kann es 2 Ausgänge haben. Dies wird durch die 'then-Klausel' definiert. Entweder kann die Operation ein Erfolg sein, der durch den Parameter 'onFulfilled' gekennzeichnet ist. Oder es kann ein Fehler vorliegen, der durch den Parameter 'onRejected' gekennzeichnet ist.
Hinweis: Der Schlüsselaspekt eines Versprechens ist also der Rückgabewert. Bei der Arbeit mit normalen Rückrufen in Node.js gibt es kein Konzept für einen Rückgabewert. Aufgrund des Rückgabewerts haben wir mehr Kontrolle darüber, wie die Rückruffunktion definiert werden kann.
Im nächsten Thema sehen wir ein Beispiel für Versprechen und wie sie von Rückrufen profitieren.
Rückrufe auf Versprechen
Schauen wir uns nun ein Beispiel an, wie wir "Versprechen" in einer Node.js-Anwendung verwenden können. Um Versprechen in einer Node.js-Anwendung verwenden zu können, muss zuerst das Modul 'Versprechen' heruntergeladen und installiert werden.
Wir werden dann unseren Code wie unten gezeigt ändern, wodurch ein Mitarbeitername in der 'Mitarbeiter'-Sammlung mithilfe von Versprechungen aktualisiert wird.
Schritt 1) Installieren der NPM-Module
Um Promises aus einer Node JS-Anwendung heraus zu verwenden, ist das Promise-Modul erforderlich. Führen Sie den folgenden Befehl aus, um das Versprechen-Modul zu installieren
npm Installationsversprechen
Schritt 2) Ändern Sie den Code so, dass er Versprechen enthält
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 Erläuterung: -
- Der erste Teil besteht darin, das 'Versprechen'-Modul aufzunehmen, mit dem wir die Versprechen-Funktionalität in unserem Code verwenden können.
- Wir können jetzt die 'then'-Funktion an unsere MongoClient.connect-Funktion anhängen. Dies bedeutet also, dass wir beim Herstellen der Verbindung zur Datenbank das danach definierte Code-Snippet ausführen müssen.
- Schließlich definieren wir unser Code-Snippet, das die Aktualisierung von EmployeeName des Mitarbeiters mit dem Namen "Martin" auf "Mohan" übernimmt.
Hinweis:-
Wenn Sie jetzt den Inhalt Ihrer MongoDB-Datenbank überprüfen, werden Sie feststellen, dass ein Datensatz mit dem Mitarbeiternamen "Martin" auf "Mohan" aktualisiert wird.
Um zu überprüfen, ob die Daten ordnungsgemäß in die Datenbank eingefügt wurden, müssen Sie die folgenden Befehle in MongoDB ausführen
- Verwenden Sie EmployeeDB
- db.Employee.find ({EmployeeName: Mohan})
Die erste Anweisung stellt sicher, dass Sie mit der EmployeeDb-Datenbank verbunden sind. Die zweite Anweisung sucht nach dem Datensatz mit dem Mitarbeiternamen "Mohan".
Umgang mit verschachtelten Versprechungen
Bei der Definition von Versprechungen ist zu beachten, dass die "then" -Methode selbst ein Versprechen zurückgibt. In gewissem Sinne können Versprechen also verschachtelt oder aneinander gekettet werden.
Im folgenden Beispiel verwenden wir die Verkettung, um zwei Rückruffunktionen zu definieren, die beide einen Datensatz in die MongoDB-Datenbank einfügen.
( Hinweis : Verkettung ist ein Konzept, mit dem die Ausführung von Methoden miteinander verknüpft wird. Angenommen, Ihre Anwendung verfügt über zwei Methoden mit den Namen 'methodA' und 'methodB'. Die Logik war so, dass 'methodB' nach 'methodA' aufgerufen werden sollte. dann würden Sie die Ausführung so verketten, dass 'methodB' direkt nach 'methodA' aufgerufen wird.)
In diesem Beispiel ist zu beachten, dass der Code durch die Verwendung verschachtelter Versprechen sauberer, lesbarer und wartbarer wird.
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 Erläuterung: -
- Wir definieren jetzt 2 "then" -Klauseln, die nacheinander ausgeführt werden. In der ersten then-Klausel übergeben wir den Parameter 'db', der unsere Datenbankverbindung enthält. Wir verwenden dann die Sammlungseigenschaft der 'db'-Verbindung, um Datensätze in die' Employee'-Sammlung einzufügen. Mit der Methode 'insertOne' wird das eigentliche Dokument in die Employee-Sammlung eingefügt.
- Wir verwenden dann die 2 nd dann Klausel auch einen anderen Datensatz in die Datenbank einzufügen.
Wenn Sie jetzt den Inhalt Ihrer MongoDB-Datenbank überprüfen, finden Sie die 2 Datensätze, die in die MongoDB-Datenbank eingefügt wurden.
Erstellen eines benutzerdefinierten Versprechens
Ein benutzerdefiniertes Versprechen kann mithilfe eines Knotenmoduls mit dem Namen "q" erstellt werden. Die 'q'-Bibliothek muss mit dem Node Package Manager heruntergeladen und installiert werden. Nach Verwendung der 'q'-Bibliothek kann die Methode "denodeify" aufgerufen werden, wodurch jede Funktion zu einer Funktion wird, die ein Versprechen zurückgibt.
Im folgenden Beispiel erstellen wir eine einfache Funktion namens "Hinzufügen", die 2 Zahlen hinzufügt. Wir werden diese Funktion in eine Funktion umwandeln, um ein Versprechen zurückzugeben.
Sobald dies erledigt ist, werden wir das von der Add-Funktion zurückgegebene Versprechen verwenden, um eine Nachricht in der console.log anzuzeigen.
Führen Sie die folgenden Schritte aus, um unsere benutzerdefinierte Funktion zu erstellen und ein Versprechen zurückzugeben.
Schritt 1) Installieren der NPM-Module
Um 'q' in einer Node JS-Anwendung verwenden zu können, ist das Modul 'q' erforderlich. Führen Sie den folgenden Befehl aus, um das Modul 'q' zu installieren
npm install q
Schritt 2) Definieren Sie den folgenden Code, der zum Erstellen des benutzerdefinierten Versprechens verwendet wird.
Code Erläuterung: -
- Das erste Bit besteht darin, die 'q'-Bibliothek unter Verwendung des Schlüsselworts require einzuschließen. Mithilfe dieser Bibliothek können wir jede Funktion definieren, um einen Rückruf zurückzugeben.
- Wir erstellen eine Funktion namens Add, die 2 in den Variablen a und b definierte Zahlen hinzufügt. Die Summe dieser Werte wird in der Variablen c gespeichert.
- Wir verwenden dann die q-Bibliothek, um unsere Add-Funktion zu denodeifizieren (die Methode, mit der eine Funktion in eine Funktion konvertiert wird, die ein Versprechen zurückgibt) oder auf andere Weise unsere Add-Funktion in eine Funktion zu konvertieren, die ein Versprechen zurückgibt.
- Wir rufen jetzt unsere "Add" -Funktion auf und können aufgrund des vorherigen Schritts, den wir durchgeführt haben, um die Add-Funktion zu denodifizieren, einen Rückgabeversprechen erhalten.
- Das Schlüsselwort 'then' wird verwendet, um anzugeben, dass bei erfolgreicher Ausführung der Funktion die Zeichenfolge "Additionsfunktion abgeschlossen" in der Datei console.log angezeigt wird.
Wenn der obige Code ausgeführt wird, wird die Ausgabe "Additionsfunktion abgeschlossen" in der console.log angezeigt (siehe unten).
Zusammenfassung
- Die Verwendung von Rückruffunktionen in Node.js hat seine Nachteile. Manchmal während des Entwicklungsprozesses kann die verschachtelte Verwendung von Rückruffunktionen den Code unübersichtlicher und schwieriger zu warten machen.
- Die meisten Probleme mit verschachtelten Rückruffunktionen können durch die Verwendung von Versprechungen und Generatoren in node.js behoben werden
- Ein Versprechen ist ein Wert, der von einer asynchronen Funktion zurückgegeben wird, um den Abschluss der von der asynchronen Funktion ausgeführten Verarbeitung anzuzeigen.
- Versprechen können ineinander verschachtelt werden, damit Code besser aussieht und einfacher zu warten ist, wenn eine asynchrone Funktion nach einer anderen asynchronen Funktion aufgerufen werden muss