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创build了一个新的匿名函数,所以没有引用有界的侦听器。

例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 ,它支持事件的自定义上下文(类上下文可以作为第三个parameter passing给addListener函数( this.emitter.addListener("test", this.handleTestEvent, this ))它完美的工作,但我宁愿要使用Node.js中包含的EventEmitter 。

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

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

如果你想使用尖端,你可以使用build议的绑定运算符作为一个快捷方式:

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

或者使用属性初始值设定项来创build一个绑定的方法:

 constructor(private text: string) { this.emitter = new EventEmitter(); this.emitter.addListener("test", this.handleTestEvent); this.emitter.emit("test"); } handleTestEvent = () => { console.log(this.text); } 

你可能已经整理出来了,但是你可以完成

 import {EventEmitter} from "events"; class HasEvents extends EventEmitter {} const emitter = new HasEvents();