Ich habe ein einfaches Knotenmodul, das eine Verbindung zu einer Datenbank herstellt und mehrere Funktionen zum Empfangen von Daten hat, zum Beispiel diese Funktion:
dbConnection.js:
import mysql from 'mysql';
const connection = mysql.createConnection({
host: 'localhost',
user: 'user',
password: 'password',
database: 'db'
});
export default {
getUsers(callback) {
connection.connect(() => {
connection.query('SELECT * FROM Users', (err, result) => {
if (!err){
callback(result);
}
});
});
}
};
Das Modul würde auf diese Weise von einem anderen Knotenmodul aufgerufen:
app.js:
import dbCon from './dbConnection.js';
dbCon.getUsers(console.log);
Ich möchte Versprechen anstelle von Rückrufen verwenden, um die Daten zurückzugeben. Bisher habe ich im folgenden Thread über verschachtelte Versprechen gelesen: Schreiben von sauberem Code mit verschachtelten Versprechen , aber ich konnte keine Lösung finden, die für diesen Anwendungsfall einfach genug ist. Was wäre der richtige Weg, um result
mit einem Versprechen zurückzukehren?
Antworten:
Verwendung der
Promise
KlasseIch empfehle, einen Blick auf die Promise-Dokumente von MDN zu werfen die einen guten Ausgangspunkt für die Verwendung von Promises bieten. Alternativ bin ich sicher, dass online viele Tutorials verfügbar sind. :)
Hinweis: Moderne Browser unterstützen bereits die ECMAScript 6-Spezifikation von Promises (siehe die oben verlinkten MDN-Dokumente), und ich gehe davon aus, dass Sie die native Implementierung ohne Bibliotheken von Drittanbietern verwenden möchten.
Wie für ein aktuelles Beispiel ...
Das Grundprinzip funktioniert folgendermaßen:
resolve
undreject
Dies scheint viel zu sein, daher hier ein aktuelles Beispiel.
Verwenden der Sprachfunktion async / await (Node.js> = 7.6)
In Node.js 7.6 wurde der v8-JavaScript-Compiler mit asynchroner / warten-Unterstützung aktualisiert . Sie können jetzt Funktionen als solche deklarieren. Dies
async
bedeutet, dass sie automatisch eine zurückgeben,Promise
die aufgelöst wird, wenn die asynchrone Funktion die Ausführung abgeschlossen hat. Innerhalb dieser Funktion können Sie die verwendenawait
Schlüsselwort warten, bis ein anderes Versprechen aufgelöst wird.Hier ist ein Beispiel:
quelle
Mit Bluebird können Sie
Promise.promisifyAll
(undPromise.promisify
) verwenden, um jedem Objekt Promise-fähige Methoden hinzuzufügen.Und verwenden Sie wie folgt:
oder
Entsorger hinzufügen
Bluebird unterstützt viele Funktionen, eine davon sind Entsorger. Mit Hilfe von
Promise.using
und können Sie eine Verbindung sicher entsorgen, nachdem sie beendet wurdePromise.prototype.disposer
. Hier ist ein Beispiel aus meiner App:Dann benutze es so:
Dadurch wird die Verbindung automatisch beendet, sobald das Versprechen mit dem Wert aufgelöst wird (oder mit einem abgelehnt wird
Error
).quelle
try-catch
bei jedem Anruf verwenden. Wenn Sie dies also häufig tun und Ihre Codekomplexität dem Beispiel ähnelt, sollten Sie dies überdenken.Node.js Version 8.0.0+:
Sie müssen Bluebird nicht mehr verwenden , um die Knoten-API-Methoden zu versprechen. Denn ab Version 8 können Sie native util.promisify verwenden :
Jetzt müssen Sie keine Drittanbieter-Bibliothek mehr verwenden, um das Versprechen zu machen.
quelle
Angenommen, Ihre Datenbankadapter-API gibt sich nicht
Promises
selbst aus, können Sie Folgendes tun:Wenn die Datenbank-API dies unterstützt, können
Promises
Sie Folgendes tun: (Hier sehen Sie die Kraft von Promises, Ihr Rückruf-Flaum verschwindet so ziemlich)Verwenden von
.then()
, um ein neues (verschachteltes) Versprechen zurückzugeben.Rufen Sie an mit:
Ich habe für meine Versprechen eine Modell-API verwendet. Ihre API ist möglicherweise anders. Wenn Sie mir Ihre API zeigen, kann ich sie anpassen.
quelle
Promise
Konstruktor und eine.promise()
Methode?promise = new Promise();
?Promises
wird, können Sie keine Rückrufe mehr verwenden. Sobald Sie in das Gebiet der Verheißung geraten, verschwindet die 'Pyramide'. Sehen Sie sich das zweite Codebeispiel an, wie das funktionieren würde.2019:
Verwenden Sie dieses native Modul
const {promisify} = require('util');
, um ein einfaches altes Rückrufmuster in ein Versprechungsmuster umzuwandeln, damit Sie vomasync/await
Code profitieren könnenquelle
Beim Einrichten eines Versprechens nehmen Sie zwei Parameter
resolve
undreject
. Im Erfolgsfallresolve
mit dem Ergebnis aufrufen,reject
im Fehlerfall mit dem Fehler aufrufen .Dann können Sie schreiben:
callback
wird mit dem Ergebnis des versprochenen Versprechens aufgerufengetUsers
, dhresult
quelle
Verwenden der Q-Bibliothek zum Beispiel:
quelle
Der folgende Code funktioniert nur für den Knoten -v> 8.x.
Ich verwende diese Promisified MySQL-Middleware für Node.js.
Lesen Sie diesen Artikel Erstellen Sie eine MySQL-Datenbank-Middleware mit Node.js 8 und Async / Await
database.js
Sie müssen den Knoten -v> 8.x aktualisieren
Sie müssen die asynchrone Funktion verwenden, um wait verwenden zu können.
Beispiel:
quelle