リスナーを削除する可能性があるイベントリスナーメソッドのクラスコンテキストにアクセスする方法はありますか?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.