JavaScript 逆引き集 | EventEmitter(Node)

JavaScript JavaScript
スポンサーリンク

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');
JavaScript
  • new 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を使っている。

これを覚えれば「チャット通知」「タイマー」「非同期処理の完了イベント」など、イベント駆動型のプログラムを自在に作れるようになります。

タイトルとURLをコピーしました