Node書くならEventEmitterについて知っとくべし

  • 287
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

Nodeの組み込みモジュール・サードパーティモジュール問わず広く使われるのが EventEmitter オブジェクト。
これはNodeで使われるデザインパターンの筆頭みたいなものなので、知っておかねばならない。

ドキュメント: Events

ブラウザ上のJavaScriptで addEventListener を使ってイベントドリブンの開発を行うが、Node上でそれを行うのための機能を提供するのが EventEmitter
例えば次のように使う

var EventEmitter = require('events').EventEmitter;

function asyncFunc() {
  var ev = new EventEmitter;
  console.log('in asyncFunc');
  setTimeout(function () {
    ev.emit('done', 'foo', 'bar');
  }, 1000);
  return ev;
}

var async = asyncFunc();
async.on('done', function(arg1, arg2) {
  console.log(arg1, arg2);
})

これを実行すると in asyncFunc と表示された1秒後に foo bar と表示される。

Nodeを使うと非同期処理が多くなるが、コールバックを受け取る設計では、複数の関数を実行したい時面倒くさい。
そこでコールバックを受け取る代わりに EventEmitter を返すようにする。一回だけしか実行されないなら once を使うといい。

var ev = new EventEmitter;

ev.on('data', function(data) {console.log('on', data);});
ev.once('data', function(data) {console.log('once', data);});

ev.emit('data', 1);
// => on 1
// => once 1
ev.emit('data', 2);
// => on 2
// once は実行されない

組み込みモジュールで EventEmitter を使っているものは非常に多い。非同期処理がからむモジュールは基本的にみな使っていると言って過言でない。
サードパーティだと例えば Socket.IO が同様のインタフェースを用いている。