2015-06-23 5 views
19

zu binden Ich fand den harten Weg, dass man einfach nicht einfach die Funktion eines Objekts in den Bluebird then übergeben kann. Ich nehme an, dass Bluebirds then Magie macht und die übergebene Funktion in einer anonymen Funktion einhüllt. Also habe ich eine .bind an die Funktion angehängt und es hat funktioniert. Ist dies der richtige Weg, dies mit Bluebird zu tun? Oder gibt es einen besseren Weg?Der richtige Weg, um Objekt an Promise.then() Argument

Ich weiß nichts davon ist async so bitte mit dem Sync-Beispiel, meine Verwendung ist async.

+0

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

+0

Sicher. Wenn @thefourtheye richtig ist und dieses 'Versprechen' sein eigenes 'bind'-Feature hat, würde ich das wahrscheinlich verwenden. – Lambart

+0

@Lambart Es ist eine Bluebird spezifische Funktion :-) – thefourtheye

Antwort

22

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); 

Verwandte Themen