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