nehme ich erstellt oder eine node.js Bibliothek lib.js
Promisify importierte Klasse (Konstruktor) mit drossel in ES6 + babel
export class C {
constructor(value, callback) {
callback(false, `Hello ${value}`);
}
task(value, callback) {
callback(false, "returned " + value);
}
}
Der wichtige Teil ist, dass die Klassen Konstruktor einen Rückruf akzeptieren muss, wie es funktioniert Datenbankverbindungen und Datei-I/O. Wenn ich jetzt den Callback-Stil der Bibliothek importiere und verwende, ist alles in Ordnung (siehe unten c1
).
Ich würde wirklich gerne die Bibliothek promitrifizieren, wo ich es Objektkonstruktion bequemer (in Wirklichkeit ist es eine ganze Reihe von Klassen und Methoden) zu machen.
Allerdings kann ich keinen Weg finden, new
die Klasse richtig in einem Versprechen sicher schön.
import Promise from 'bluebird';
import * as lib from './lib';
Promise.promisifyAll(lib);
// old style -- works as expected
const c1 = new lib.C("c1", (e, v) => {
console.log(c1, e, v);
});
// assuming c1 got initialized, .task() also works
c1.task("t1", console.log);
c1.taskAsync("t2").then(() => console.log("also works"));
// But how to do this properly with promises?
const c2 = new lib.C("c2"); c2.then(console.log); // clearly doesn't work, lack of callback
const c3 = new lib.CAsync("c3"); c3.then(console.log); // "cannot read property apply of undefined"
const c4 = ???
Wie würde ich das am besten machen? Das Ändern der Bibliothekssignatur ist keine gute Option, das Erstellen von Factory-Methoden scheint ebenfalls hässlich zu sein.
nicht tun IO es eine schlechte Idee ist zusammen io und Konstruktion zu binden:
Dies kann zu einem Muster extrahiert werden. –
Stilistisch haben Sie wahrscheinlich Recht. Aber ist das nicht das, was der Knoten Redis-Bibliotheken und viele andere Bibliotheken auch (implizit) tun? Es ist auch nicht so, dass ich blockiere oder irgendetwas, nur Aktionen auszulösen. – left4bread
@ left4bread Das Ausführen von IO (selbst wenn nur Verbindungen hergestellt werden) in Ihrem Konstruktor führt Sie normalerweise zu Initialisierungsschleifen in kurzer Reihenfolge. Wenn Sie die IO-Arbeit in eine Methode aufteilen ('r = new Database(); r.openPool();') kann Ihr Code viel einfacher und testbarer werden. – ssube