2016-10-02 7 views
5

リスナーを削除する可能性があるイベントリスナーメソッドのクラスコンテキストにアクセスする方法はありますか?Node.js EventEmitter:クラスリスナーにクラスコンテキストをバインドしてからこのリスナーを削除する方法

例1:リスナーを除去する。この例では

import {EventEmitter} from "events"; 

export default class EventsExample1 { 
    private emitter: EventEmitter; 

    constructor(private text: string) { 
     this.emitter = new EventEmitter(); 

     this.emitter.addListener("test", this.handleTestEvent); 
     this.emitter.emit("test"); 
    } 


    public dispose() { 
     this.emitter.removeListener("test", this.handleTestEvent); 
    } 

    private handleTestEvent() { 
     console.log(this.text); 
    } 
} 

は動作しますが、handleTestEvent()方法はthisを使用して、クラス・コンテキストへのアクセスを有していません。 thisがEventEmitterコンテキストを指しているため、this.textにアクセスできません。

例2:この例では

import {EventEmitter} from "events"; 

export default class EventsExample2 { 
    private emitter: EventEmitter; 

    constructor(private text: string) { 
     this.emitter = new EventEmitter(); 

     this.emitter.addListener("test", this.handleTestEvent.bind(this)); 
     this.emitter.emit("test"); 
    } 

    public dispose() { 
     this.emitter.removeListener("test", this.handleTestEvent); 
    } 

    private handleTestEvent() { 
     console.log(this.text); 
    } 
} 

、私はイベントリスナーにクラスのコンテキストをバインドするbind機能を使用しています。今度はhandleTestEventメソッドは、this =>this.textを使用してクラスコンテキストにアクセスできますが、removeListenerでリスナーを削除することはできません。bindは新しい匿名関数を作成すると思われますので、バインドされたリスナーへの参照はありません。

例3:この例では

import {EventEmitter} from "events"; 

export default class EventsExample3 { 
    private emitter: EventEmitter; 

    constructor(private text: string) { 
     this.emitter = new EventEmitter(); 

     this.emitter.addListener("test",() => this.handleTestEvent()); 
     this.emitter.emit("test"); 
    } 

    public dispose() { 
     this.emitter.removeListener("test", this.handleTestEvent); 
    } 

    private handleTestEvent() { 
     console.log(this.text); 
    } 
} 

、Iは、イベントリスナにクラスのコンテキストを維持するために、矢印関数を使用しています。 handleTestEventメソッドはthisを使用してクラスコンテキストにアクセスできますが、リスナーを削除することはできません(例2のように境界のあるリスナーへの参照はありません)。

私は、代替イベントライブラリを試した

- イベント用のカスタムコンテキストをサポートしていEventEmitter3クラスのコンテキストはaddListener機能(this.emitter.addListener("test", this.handleTestEvent, this)の3番目のパラメータとして渡すことができます(、それは完璧に動作しますが、私はむしろ使用したいですあなたは、コンストラクタでこれを行うことができNode.js.

答えて

4

からEventEmitterが含まれていました。

this.handleTestEvent = this.handleTestEvent.bind(this); 
this.emitter.addListener("test", this.handleTestEvent); 

あなたが最先端使用する場合は、ショートカットとしてproposed bind operatorを使用することができます。

this.handleTestEvent = ::this.handleTestEvent; 
this.emitter.addListener("test", this.handleTestEvent); 

または結合方法の作成にproperty initializerを使用して:あなたはおそらくこれを整理

constructor(private text: string) { 
    this.emitter = new EventEmitter(); 

    this.emitter.addListener("test", this.handleTestEvent); 
    this.emitter.emit("test"); 
} 

handleTestEvent =() => { 
    console.log(this.text); 
} 
0

をあなただけ

import {EventEmitter} from "events"; 

class HasEvents extends EventEmitter {} 

const emitter = new HasEvents(); 

を行っている可能性
関連する問題