Node.js EventEmitter:如何绑定一个类上下文到事件监听器,然后移除这个监听器
Node.js EventEmitter: How to bind a class context to the event listener and then remove this listener
是否有一种方法可以访问事件侦听器方法中的类上下文,并可能删除侦听器?
示例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
),它工作完美,但我更想使用Node.js中包含的EventEmitter。
可以在构造函数中这样做:
this.handleTestEvent = this.handleTestEvent.bind(this);
this.emitter.addListener("test", this.handleTestEvent);
如果想使用cutting edge,可以使用建议的绑定操作符作为快捷方式:
this.handleTestEvent = ::this.handleTestEvent;
this.emitter.addListener("test", this.handleTestEvent);
或者使用属性初始化器创建绑定方法:
constructor(private text: string) {
this.emitter = new EventEmitter();
this.emitter.addListener("test", this.handleTestEvent);
this.emitter.emit("test");
}
handleTestEvent = () => {
console.log(this.text);
}
我也无法删除类中的侦听器。这对我有用(见:https://nodejs.org/api/events.html#events_emitter_rawlisteners_eventname)
emitter.on('error', this.onError.bind(this));
this.onErrorListener = emitter.rawListeners('error').splice(-1)[0];
...
emitter.off('error', this.onErrorListener);
- 在video.js播放器上制作水印,成为播放和停止的监听器
- 如何在JS中使用事件监听器
- 何时在 Cocos2d-js 3.2 中注销事件监听器和定时回调
- COCOS JS触摸监听器
- Node js事件监听器.使用匿名回调或声明函数来提高性能
- 跨浏览器Js监听器
- 如何移除事件监听器,在jQuery中设置,使用纯JS
- 通过类添加事件监听器,在JS中传递ID作为参数
- 如何删除Hammer.js 2.0中的事件监听器,并将识别器绑定到一个新函数
- Node.js发送到一个特定的监听器
- 如何在JS事件监听器中获得正确的按键语言和大小写
- Node.js EventEmitter:如何绑定一个类上下文到事件监听器,然后移除这个监听器
- Js事件监听器&jQuery事件触发不成为朋友
- Fabric.js:有没有办法让这个“动起来”?当作为选择的一部分移动时,监听器会触发
- 多事件监听器在Node.js中的代码效率
- 用Node JS或PHP为MSSQL编写一个变化监听器
- backbone.js:防止在模型改变时触发监听器事件
- 在将监听器绑定到快捷键时,通过requireJS与纯JS的特性不一致
- JS事件禁用器:不能阻止本机事件监听器的执行
- 路由器(发射器)和处理器(监听器)中的Node.js事件