フロントサイドエンジニアという選択肢

HTMLコーダー → ECサイト運営 → システムエンジニア という経歴の著者がフロントサイトエンジニアという職業に今後の活路を見出し、その道に進むために取得した技術を貯めておくブログ

(Node.js)EventEmitterでイベントを登録する。

JavascriptではaddEventListenerでイベントの登録を行いますが、Node.jsではEventEmitterオブジェクトを使用してイベントの管理を行います。
基本は、onで登録、emitで発生です。

以下のサンプルは、textという内部変数を1つ持つオブジェクトを返すnodeモジュールです。
textの値はchangeTextメソッドで変更しますが、その際にchangetextイベントが発生します。addEventListenerでchangetextイベントに処理を登録できるようにしています。

// コンストラクタ
function Obj(data){	
	// イベントを管理するオブジェクト
	var event = require('events').EventEmitter;
	var em = new event ;
	
	// 内部変数
	var text = data;
	
	// イベントリスナーを追加するメソッド
	this.addEventListener = function(event, listener){
        em.on(event, listener);
	}
	
	// テキストを変更するメソッド
	this.changeText = function(newtext){
        var oldtext = text ;
        text = newtext;
		
        // テキスト変更時にchangeDataイベントを発生させる
        em.emit('changedata', oldtext , newtext);
	}
	
	this.getText = function(){
		return text ;
	}
	
	console.log('new obj is created by %s', data);
};

// インスタンスを作成
var newObject = new Obj('new data');

// イベント登録
 newObject.addEventListener('changedata', function(a,b){
        console.log('text changed "%s" to "%s"', a, b);
	});

module.exports = newObject ;

ポイントは、emit時の引数で、第一引数はイベント名になっていますが、第二引数以降は任意のものを渡すことができます。
ここで渡した第二以降の引数は、onで登録する際にlistenerとして渡すコールバック関数にそのまま渡されます。上記のサンプルの場合は、em.emit('changedata', oldtext , newtext);のoldtextとnewtextが、イベント登録時のa,bになります。

EventEmitterのメソッド一覧
on(event, listener) イベントハンドラの登録
addListener(event, listener) onと同じ
once(event, listener) 一度だけ実行されるイベントハンドラを登録
removeListener(event, listener) イベントハンドラの削除
removeAllListener([events]) 複数イベントハンドラを一括で削除する
setMaxListener(max) イベントに持たせるハンドラの上限を設定する。デフォルトは10個
listeners(event) イベントに登録されているハンドラを全て取得する
emit(event, args, ...) イベントを発生させる