EventEmitter

EventEmitter とは

サーバサイドで用いるイベント駆動プログラミング手法である。

EventEmitter は Observer(監視役) パターンにおける Subject として機能する。

1 回の要求に対して結果が複数発生する非同期処理の場合に利用する。

  • EventEmitter インスタンス生成の中で同期的にイベントを発行してはいけない
  • EventEmitter に対する Observer は同期的に実行される
  • リスナ内部に参照が残り、メモリーリークが発生する

難しくて理解が追いつかない。とにかく on するやつの正体はこいつだとのこと。

const event = require('events').EventEmitter;
const http = require('http');

const evt = new event();

const srv = http.createServer((req, res) => {
  // emitter.emit(eventName[, ...args])
  // <string: event name> | <symbol>
  // ...args <any>
  evt.emit('connect', req.method, req.url);
});

srv.listen(8080);

// emitter.on(eventName, listener)
// <string: event name> | <symbol>
// listener <Function: callback function>
evt.on('connect', (method, url) => {
  console.log(`METHOD: ${method} URL: ${url}`);
});

web-serv.js として上記のコードを記述。 REPL にて

> .load web-serv.js
# 省略...
EventEmitter {
  _events: [Object: null prototype] { connect: [Function (anonymous)] },
  _eventsCount: 1,
  _maxListeners: undefined,
  [Symbol(kCapture)]: false
}

ブラウザを立ち上げて、 localhost:8080 にアクセスしてみると

> METHOD: GET URL: /

続いて、 localhost:8080/about とすると

METHOD: GET URL: /about

on メソッドで登録した処理が emit で呼ばれていることを確認できた。ひとしきり遊んだ後

> srv.close()

on メソッドのドキュメント

emit メソッドのドキュメント