LoginSignup
355

More than 5 years have passed since last update.

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

Last updated at Posted at 2012-03-08

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 が同様のインタフェースを用いている。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
355