Ersetzen von Rückrufen durch Versprechen in Node.js
Habe ich eine einfache Knoten-Modul, welches eine Verbindung zu einer Datenbank und hat mehrere Funktionen, um Daten zu empfangen, 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);
}
});
});
}
};
Des Moduls aufgerufen werden würde, auf diese Weise von einem anderen Knoten, Modul:
app.js:
import dbCon from './dbConnection.js';
dbCon.getUsers(console.log);
Möchte ich nutzen, verspricht anstelle von Rückrufen, um die Daten zurückzugeben.
So weit ich gelesen habe, über verschachtelte verspricht in den folgenden thread: Schreiben Sauberen Code Mit Verschachtelten Verspricht, aber ich konnte nicht finden keine Lösung, die einfach genug für diesen Anwendungsfall.
Was wäre der richtige Weg, um wieder result
mit einem Versprechen?
InformationsquelleAutor der Frage Lior Erez | 2015-02-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit der
Promise
KlasseEmpfehle ich einen Blick auf MDN Versprechen docsdie bieten einen guten Ausgangspunkt für die Nutzung Verspricht. Alternativ, ich bin sicher, es gibt viele tutorials online verfügbar.:)
Hinweis: Moderne Browser unterstützen bereits ECMAScript-6-Spezifikation von Versprechungen (sehen Sie MDN docs weiter oben verlinkt), und ich nehme an, Sie wollen, verwenden Sie die native Implementierung, ohne 3rd-party-Bibliotheken.
Als für ein Aktuelles Beispiel...
Das Grundprinzip funktioniert wie folgt:
resolve
undreject
Dies mag wie eine Menge, so ist hier ein Aktuelles Beispiel.
Mithilfe der async/await-Sprache-Funktion (Node.js >=7.6)
In Node.js 7.6, die v8-JavaScript-compiler wurde aktualisiert mit async/await-Unterstützung. Können Sie jetzt erklären, die Funktionen als
async
was bedeutet, dass Sie automatisch wieder einPromise
ist aufgelöst, wenn die asynchrone Funktion Ausführung abgeschlossen ist. Innerhalb dieser Funktion, die Sie verwenden können, dieawait
Stichwort zu warten, bis ein anderes Versprechen löst.Hier ist ein Beispiel:
InformationsquelleAutor der Antwort Robert Rossmann
Mit bluebird können Sie
Versprechen.promisifyAll
(undVersprechen.promisify
) hinzufügen Versprechen bereit, Methoden auf jedes Objekt.Und verwenden, wie diese:
oder
Hinzufügen Entsorger
Bluebird unterstützt eine Menge von Funktionen, einer von Ihnen ist der Entsorger, es erlaubt Ihnen, sicher zu entsorgen, wird eine Verbindung, nachdem es endete mit der Hilfe von
Promise.using
undPromise.prototype.disposer
. Hier ist ein Beispiel aus meiner app:Dann verwenden Sie es wie diese:
Dadurch wird automatisch die Verbindung, sobald das Versprechen aufgelöst wird, mit dem Wert (oder lehnt Sie mit einer
Error
).InformationsquelleAutor der Antwort Madara Uchiha
Node.js version 8.0.0+:
Brauchen Sie nicht zu verwenden, bluebird zu promisify der node-API-Methoden mehr. Weil, von version 8+, die Sie verwenden können native util.promisify:
Nun, nicht zu verwenden 3rd-party-lib zu tun die promisify.
InformationsquelleAutor der Antwort asmmahmud
Vorausgesetzt, Ihr Datenbank-adapter-API nicht ausgeben
Promises
selbst können Sie etwas tun:Wenn die Datenbank-API unterstützt
Promises
Sie könnten etwas tun wie: (hier sehen Sie die macht von Versprechen, Ihre callback-fluff ziemlich viel verschwindet)Mit
.then()
um wieder eine neue (geschachtelte) Versprechen.Anruf mit:
Habe ich eine mockup-API für mein Versprechen, Ihre API anders sein kann. Wenn Sie mir zeigen, Ihre API kann ich es individuell.
InformationsquelleAutor der Antwort Halcyon
Beim einrichten eines Versprechen, Sie nehmen zwei Parameter
resolve
undreject
. Im Falle von Erfolg, rufen Sieresolve
mit dem Ergebnis, im Falle des Scheiterns nennenreject
mit dem Fehler.Dann können Sie schreiben:
callback
aufgerufen werden, mit dem Ergebnis, das Versprechen zurück vongetUsers
d.h.result
InformationsquelleAutor der Antwort Tom
Mit Hilfe der Q-Bibliothek Beispiel:
InformationsquelleAutor der Antwort satchcoder
Code unten funktioniert nur bei Knoten -v - > 8.x
Ich diese Promisified MySQL middleware für Node.js
Lesen Sie diesen Artikel Erstellen der MySQL-Datenbank-Middleware mit Node.js 8 und Async/Await
database.js
Müssen Sie ein upgrade node-v > 8.x
müssen Sie async-Funktion nutzen zu können, erwarten Sie.
Beispiel:
InformationsquelleAutor der Antwort hoogw