2017-03-24 7 views
0

Ich versuche, eine Methode von einem require d Knotenmodul mit einem spezifischen this Objekt aufzurufen. Soweit ich sehe, gibt es drei Möglichkeiten, dies zu tun, mit .bind(obj)(args), oder mit .call(obj, arg1, ...), oder mit .apply(obj, aryArgs). Ich verwende derzeit bind, aber ich habe alle drei mit identischen Ebenen von Nicht-Erfolg versucht. DieseWarum wird mein Objekt gebunden ignoriert?

ist, wo ich den Anruf renne:

var library = require("./library.js"); 

// ... 

requestHandler.bind(library)(req); 

requestHandler ist ein Verweis auf die exportierte status Funktion aus dieser Datei:

exports.status =() => { 
    console.log(this); 
    this.render({text: "status ok"}); 
}; 

exports.paramSwitching =() => { 
    this.render("rendered via param switching"); 
}; 

exports.json =() => { 
    this.render({json: {this: 'renders', as: 'json'}}); 
}; 

exports.view =() => { 
    this.render({view: true, locals: {text: 'hi'}}); 
}; 

Ich möchte dies so arbeiten, dass Die status Funktion wird mit library als this Objekt aufgerufen, da render definiert ist. Allerdings ist die console.log Anweisung this als die ausgewerteten Inhalt der Datei zeigt status halten, das heißt

{ status: [Function], 
    paramSwitching: [Function], 
    json: [Function], 
    view: [Function] } 

Was hier passiert, und wie kann ich es beheben? (Oder, wenn ich nicht kann, weil Node etwas komisch macht, gibt es einen Workaround?)

+0

Bitte fügen Sie den Code, der 'requestHandler' definiert, ein, da es keine Referenz auf die' .status'-Methode im Export ist, sondern das gesamte 'exports'-Objekt – Pineda

+0

@Pineda: Es ist bereits enthalten.Lesen Sie die Frage sorgfältig – slebetman

+0

Wie immer, wenn es ein Missverständnis von "this" gibt, werde ich Leser auf meine Antwort auf diese Frage zeigen: http://stackoverflow.com/questions/13441307/how-does-the-this-keyword -javascript-act-in-einem-objekt-literal/13441628? s = 1 | 4.1585 # 13441628 – slebetman

Antwort

1

Ihre Anfrage Handler wird mit Pfeil Notation erklärt:

exports.status =() => { 
    console.log(this); 
    this.render({text: "status ok"}); 
}; 

Mit dem Design der Pfeil-Notation this zu der Zeit erfasst die Funktion deklariert ist. Es ist fast so, als ob du das getan hast:

exports.status = (function(){ 
    console.log(this); 
    this.render({text: "status ok"}); 
}).bind(this); 

Das bedeutet, die status() Funktion ist bereits gebunden und nicht Rebound sein kann. Die Lösung besteht darin, die Pfeilfunktionen zu stoppen:

exports.status = function(){ 
    console.log(this); 
    this.render({text: "status ok"}); 
}; 
1

Die Pfeilfunktion selbst bindet bereits die this innerhalb der Funktion Körperfunktion an die this des Kontextes, in dem es definiert wurde. So Sie können die this mit keiner dieser Methoden ändern. Wenn Sie die this ändern müssen, können Sie keine Pfeilfunktionen verwenden.

1

Ich habe es herausgefunden, nachdem ich diese Frage gepostet habe. Ich habe Pfeilfunktionen in der Datei verwendet, die status enthält, die do not create their own this scope aber den umschließenden Kontext verwenden.

Aufruf bind, call oder apply zu diesen Funktionen haben keine Auswirkung, da this bereits auf die Funktion der umschließenden Kontext gesetzt, die in diesem Fall ist die eval'd Datei.

Das Umschalten der Pfeilfunktionen für reguläre Funktionen (das Ändern von () => zu function()) hat das Problem behoben.

Verwandte Themen