EventEmitter(Node.js) — const e = new EventEmitter(); e.on('x', ()=>{})
Node.js には イベント駆動 の仕組みがあり、その中心にあるのが EventEmitter クラスです。
「イベントを登録して、あとで発火(emit)する」ことで、処理を柔軟に組み立てられます。初心者がまず覚えるべきは「イベントを監視して、emitで呼び出す」流れです。
基本のコード例
const EventEmitter = require('events');
// イベント管理オブジェクトを作成
const e = new EventEmitter();
// イベント 'x' を監視
e.on('x', () => {
console.log("イベント x が発火しました!");
});
// イベントを発火
e.emit('x');
JavaScriptnew EventEmitter()→ イベントを管理するインスタンスを作成。on('イベント名', コールバック)→ イベントを監視(リスナー登録)。emit('イベント名')→ イベントを発火して、登録された処理を実行。
よく使うテンプレート集
イベントにデータを渡す
e.on('greet', (name) => {
console.log(`こんにちは ${name}`);
});
e.emit('greet', 'Aki'); // → "こんにちは Aki"
JavaScript一度だけ処理する(once)
e.once('init', () => {
console.log("初期化イベント(1回だけ)");
});
e.emit('init'); // 実行される
e.emit('init'); // 2回目は無視される
JavaScript複数リスナー
e.on('data', (d) => console.log("リスナー1:", d));
e.on('data', (d) => console.log("リスナー2:", d));
e.emit('data', "情報");
JavaScript例題: 簡易チャットイベント
const EventEmitter = require('events');
const chat = new EventEmitter();
// メッセージ受信イベント
chat.on('message', (user, text) => {
console.log(`${user}: ${text}`);
});
// ユーザーがメッセージを送信
chat.emit('message', 'Aki', 'こんにちは!');
chat.emit('message', 'Mika', 'やっほー!');
JavaScript- 効果:
emitでチャットメッセージを送ると、onで受け取って表示。
実務でのコツ
- 非同期処理と相性が良い: ファイル読み込みやHTTP通信など、Node.jsの多くの仕組みが EventEmitter を利用。
- once vs on: 初期化処理など一度だけ必要なイベントは
onceを使う。 - エラーイベント:
errorイベントを監視しておくと安全。 - カスタムイベント: 自作クラスに EventEmitter を継承して、独自イベントを作れる。
ありがちなハマりポイントと対策
- emitしても反応しない:
- 原因:
onでリスナーを登録していない。 - 対策: 必ず
onを先に書く。
- 原因:
- イベントが複数回呼ばれる:
- 原因: 同じイベントに複数回
onを登録している。 - 対策: 不要なリスナーを削除するか
onceを使う。
- 原因: 同じイベントに複数回
- エラー未処理:
- 原因:
errorイベントを監視していない。 - 対策:
e.on('error', handler)を必ず用意。
- 原因:
練習問題(タイマーイベント)
const EventEmitter = require('events');
const timer = new EventEmitter();
// 1秒ごとにイベント発火
setInterval(() => {
timer.emit('tick', new Date());
}, 1000);
// tickイベントを監視
timer.on('tick', (time) => {
console.log("現在時刻:", time.toLocaleTimeString());
});
JavaScript- 効果: 1秒ごとに
tickイベントが発火し、現在時刻を表示。
直感的な指針
- EventEmitter = 「イベントを登録して、emitで呼び出す仕組み」。
onで監視、emitで発火。- onceで一度だけ、errorで安全対策。
- Node.jsの多くの機能が内部でEventEmitterを使っている。
これを覚えれば「チャット通知」「タイマー」「非同期処理の完了イベント」など、イベント駆動型のプログラムを自在に作れるようになります。
