Also habe ich eine .bind
an die Funktion angeschlossen und es hat funktioniert. Ist dies der richtige Weg, dies mit Bluebird zu tun?
Ja, das ist eine Möglichkeit, den Kontext beizubehalten. Sie können auch eine anonyme Funktion übergeben (Sie kennen das vielleicht schon).
Promise.resolve("cherry")
.then(function (value) {
return chair.build(value);
})
.then(console.log);
Oder gibt es eine bessere Art und Weise?
Sie können tatsächlich Promise.bind
drossel die Verwendung Methode, wie diese
Promise.resolve("cherry")
.bind(chair)
.then(chair.build)
.then(console.log)
Nun, wenn die Versprechen Handler (erfüllen Handler oder Ablehnung Handler) aufgerufen, innerhalb der Funktion, wird this
beziehen die chair
Objekt nur .
Anmerkung 1: In diesem speziellen Fall console.log
bekommt auch this
als chair
Objekt, aber es immer noch gut funktioniert, weil in Node.js, console.log
Funktion definiert ist, nicht nur auf dem Prototyp bu auch auf dem Objekt selbst, gebunden an das Objekt console
. Der entsprechende Code lautet here.
Anmerkung 2: Wenn verschiedene Handler unterschiedlichen Kontexten müssen, dann besser schreiben anonyme Funktionen. In diesem Fall wird Promise.bind
nicht viel helfen. Aber wenn Sie sich entscheiden, es zu benutzen, dann müssen Sie für jeden der Handler verschiedenen Kontexten nutzen und Ihr Code könnte so etwas wie folgt aussehen
var chair1 = new Chair("red")
var chair2 = new Chair("green")
Promise.resolve("cherry")
.bind(chair1) // Changing the binding to `chair1`
.then(chair1.build)
.tap(console.log)
.bind(chair2) // Changing the binding to `chair2`
.then(chair2.build)
.tap(console.log);
Haben nicht von Drossel gehört, aber wenn seine Versprechen folgen Sie dem Promise-Muster, wie es von jQuery implementiert wurde, dann ist dies der richtige Weg, solange Sie auf moderne Browser zielen, die 'Function.bind' unterstützen (andernfalls müssten Sie Ihre eigenen rollen oder Underscore für ein' verwenden bind 'shim) – Lambart
Sicher. Wenn @thefourtheye richtig ist und dieses 'Versprechen' sein eigenes 'bind'-Feature hat, würde ich das wahrscheinlich verwenden. – Lambart
@Lambart Es ist eine Bluebird spezifische Funktion :-) – thefourtheye