2016-09-16 43 views
1

我正在使用EventEmitter3這是我的javascript代碼中的事件模塊。它的工作方式與Node.js中的event模塊相同。但是我正面臨着正確使用它的問題。我可以使用this.on來收聽EventEmitter中的事件嗎?在JavaScript中尋找正確使用Eventmitter的類

通常情況下,如果我在我的代碼中使用該模塊,我會創建一個EventEmitter的對象,然後使用object.emit來觸發事件,並使用object.on來偵聽事件。而我通常所做的就是將object.on放在另一個班級,這樣它就可以很好地工作。

現在我嘗試在ES6類中組織我的代碼。所以我在我的自定義類中擴展了EventEmitter。假設它被稱爲類別A,它是EventEmitter的子類別。如果我聽自己的事件類定義,像這樣:

import EventEmitter from 'eventemitter3'; 

class ClassA extends EventEmitter { 
    constructor() { 
    ... 
    } 

    method() { 
    this.emit('send'); 
    } 

    this.on('send', function(data) { 
    // Do something with data 
    }); 
} 

我就this.on線得到一個意外標記錯誤。但我不確定如何在班級內聽課,或者這是可行的?我必須將聽衆放在類定義之外嗎?

+0

爲什麼不注入事件發射器而不是繼承它?通常構圖比繼承更靈活,更清潔。 – Yoda

+0

@Yoda你的意思是創建一個專用的事件發射器類,並在此'ClassA'中使用它?假設我有很多'ClassA'的對象,並且我希望對象只聽自己的事件,如果我使用專用事件發射器,監聽器是否會監聽來自其他對象的事件? – newguy

回答

1

你需要把那些應該爲構造函數中的每個實例上運行的呼叫:

class ClassA extends EventEmitter { 
    constructor() { 
    super() 
    … 
    this.on('send', data => { 
     // Do something with data 
    }); 
    } 

    method() { 
    this.emit('send'); 
    } 
} 

否則令實例的創建者聽的事件,還是聽/從你的類的方法中UNLISTEN。

+0

謝謝,看起來不錯,簡潔。 – newguy

相關問題