EventEmitter
GPT-4.icon
Node.js の EventEmitter は、イベント駆動型プログラミングをサポートするための核となるクラスです。EventEmitter は、特定のイベントが発生したときに事前に登録したコールバック関数を実行することができます。これにより、さまざまな部分のコード間で非同期的にデータをやり取りすることが可能になります。
on()
特定のイベントに対してリスナー(コールバック関数)を追加する
emit()
eventを発火して、listenerに通知する
removeListener()
例
code:ts
import { EventEmitter } from 'events';
// EventEmitter を継承するクラスを定義
class MyEmitter extends EventEmitter {}
// MyEmitter のインスタンスを作成
const myEmitter = new MyEmitter();
// 'event' イベントに対するリスナーを追加
myEmitter.on('event', () => {
console.log('イベントが発火しました!');
});
// 'event' イベントを発火させる
myEmitter.emit('event');
このコードは、event という名前のイベントが発火された際にコンソールにメッセージを出力するシンプルな例です。EventEmitter の力を活かすためには、より複雑なシナリオでさまざまなイベントタイプを扱うことが一般的です。
ESLintの実装内に、自作EventEmitterのようなものを作っている箇所があった
code:ts
type Listener = (...args: any[]) => void;
interface SafeEmitter {
on(eventName: string, listener: Listener): void;
emit(eventName: string, ...args: any[]): void;
eventNames(): string[];
}
function createSafeEmitter(): SafeEmitter {
const listeners: Record<string, Listener[]> = Object.create(null);
return Object.freeze({
on(eventName: string, listener: Listener): void {
if (eventName in listeners) {
} else {
}
},
emit(eventName: string, ...args: any[]): void {
if (eventName in listeners) {
// リスナーを安全に実行
try {
listener(...args);
} catch (error) {
console.error(
Error occurred in listener for ${eventName}:,
error,
);
}
});
}
},
eventNames(): string[] {
return Object.keys(listeners);
},
});
}