2016-10-02 60 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); 
    } 
} 

在本例中,我使用的箭头功能以保持类的在事件监听器的上下文。 handleTestEvent方法使用this访问类上下文,但不能删除侦听器(不像示例2中那样引用有界的侦听器)。

我已经试过替代事件库 - EventEmitter3这对于事件定义上下文(类背景下,支持可作为第三个参数addListener功能(this.emitter.addListener("test", this.handleTestEvent, this),它完美地过去了,但我更愿意使用附带EventEmitter从Node.js的

回答

4

你可以在构造函数中做到这一点:

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