りゅうじの学習blog

学習したことをアウトプットしていきます。

2022年3月24日 Node.js入門 EventEmitter

Node.jsにおけるイベント機能の中心的存在

オブジェクトを持つイベントを管理する機能がまとめられている

  • イベントが発生したとき実行する処理をあらかじめ設定します。
  • イベントが発生したとき実行する処理を設定から削除します。
  • 実際にイベント発生させます。

基本機能

イベント発火時の処理を設定する

EventEmitter.on(name, listener)
EventEmitter.once(name, listener)

イベント発火時の処理を削除する

EventEmitter.off(name, listener)

イベントを発火する

EventEmitter.emit(name, args)
  • onceは一度きりの実行のイベントに使用します。
  • 削除する際は第二引数にコールバック関数を渡す必要があります。
  • 一度発火したイベントはoffメソッドで止めることはできません。ロジックで止める必要があります。

利用方法

EventEmitterを継承したクラスの利用

//インスタンス作成
const obj = new Child();

//イベントの設定
obj.on('tick', (message) => {
    console.log(message);
});

//イベントの発火
obj.emit('tick', "Hello world");
  • emitメソッドがイベント発生させます。
  • 第一引数のtickという同じイベント名が実行されるのでonメソッドのイベントが発生します。
  • 第二引数以降に渡された値がイベント処理側に渡されます。

実用例

clock.js

const EventEmitter = require("events");
const Clock = class extends EventEmitter {
  constructor() {
    super();
    this.interval = 2000;
    this.timer = null;
  }
  start() {
    if(this.timer) {
      this.stop();
    }
    this.timer = global.setInterval(() => {
      this.emit('tick');
    }, this.interval);
  }
  stop() {
    if(!this.timer) {
      return;
    }
    global.clearInterval(this.timer);
    this.timer = null;
  }
};
module.exports = Clock;

index.js

const Clock = require("./clock.js");
let i = 0;
const clock = new Clock();
clock.on('tick', () => {
  console.log(++i)
  if(i > 3) {
    clock.stop();
  }
});
clock.start();

処理結果

f:id:ryujisurf55:20220324162651p:plain

  • clock.jsでイベントエミッターを設定してエクスポートしています。
  • index.jsでrequire を行っています。

イベント発火時emit()実行時のポイント

  • emit()で呼び出される処理は同期呼び出しです。
  • on()に設定された順に呼び出します。
const EventEmitter = require("events");
const ee = new EventEmitter;

ee.on("event", () => { console.log("1st");});
ee.on("event", () => { console.log("2st");});

ee.emit("event");

//結果
1st
2st
  • EventEmitterをrequireインスタンス化しています。
  • onメソッドでイベントを登録して第一引数にイベント名を指定して第二引数にイベントの処理を記述しています。
  • emitメソッドの引数と同名のイベントが発火しています。
  • onメソッドで定義したイベントが順番に出力されています。

参考

Udemy Node.js入門