2017-08-10 60 views
0

我試圖將類的每個實例與事件發射器關聯。我想以下幾點:連接事件發射器與節點中的每個ES6類的實例

const events = require("events"); 
const eventEmitter = new events.EventEmitter(); 

class Camera { 
    constructor(ip) { 
     this.ip = ip; 

     eventEmitter.on("recordVideo", function() { 
      this.recordClip(); 
     }); 
    } 

    recordClip() { 
     console.log("record " + this.ip); 
    } 
} 

var cam = new Camera("0.0.0.0"); 
eventEmitter.emit("recordVideo"); 

但我得到的結果:

TypeError: this.recordClip is not a function 

我怎麼能有我的類的每個實例監聽的事件?

+0

爲什麼不直接使用[你已經得到的答案]的代碼(https://stackoverflow.com/a/45601755/1048572)? – Bergi

+0

@bergi對不起,我剛剛複製並將我的函數調用粘貼到構造函數中。我沒有注意到所做的綁定改變。 –

回答

1

你這裏的問題是,this是在事件發射器,而不是類的上下文。所以,eventEmitter作爲一種方法沒有recordClip。您需要任何詞彙回調帶有箭頭的功能綁定:

(就個人而言,我認爲這是最好的,最現代的/可讀的方式做到這一點)

eventEmitter.on("recordVideo",() => { 
    this.recordClip(); 
}); 

或者,您需要綁定適當範圍:

class Camera { 
    constructor(ip) { 
     this.ip = ip; 
     const self = this; //assign this to self 
     eventEmitter.on("recordVideo", function() { 
      self.recordClip(); //use self, not this here 
     }); 
    } 

    recordClip() { 
     console.log("record " + this.ip); 
    } 
} 

eventEmitter.on("recordVideo", function() { 
    this.recordClip(); 
}).bind(this); 

或者你也可以通過self方法做一個參考

+0

你知道哪些方法會被視爲更標準或更可讀嗎? –

+1

@PhilipKirkbride我補充說,在我的編輯其實:)我認爲使用箭頭功能是這裏最標準/可讀的方法。 –

1

這是因爲回調函數中的上下文沒有引用您期望的內容。添加箭頭功能。

const events = require("events"); 
const eventEmitter = new events.EventEmitter(); 

class Camera { 
    constructor(ip) { 
    this.ip = ip; 

     eventEmitter.on("recordVideo",() => { 
     this.recordClip(); 
     }); 
    } 

    recordClip() { 
     console.log("record " + this.ip); 
    } 
} 

    var cam = new Camera("0.0.0.0"); 
    eventEmitter.emit("recordVideo"); 

下面是一些文檔:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

相關問題