有没有办法在事件侦听器方法中访问类上下文,并有可能删除侦听器?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的