356
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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 can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
356
Help us understand the problem. What are the problem?