追記
コメントで id:Jxck さんに教えていただいたように、emitter.onはリスナー配列に登録するだけなので、登録されていなければ、実行されません。
emitter.onのところ全然読んでなかった…恥ずかしいなぁ。
そして、前にJavaScriptのイベントリスナーをちょっと調べた時に同様のことを思った記憶がある…
なので、↓は全部勘違い。
ドキュメントを見ると
EventEmitter のインスタンスがエラーに遭遇した時、 典型的な動作は 'error' イベントを生成することです。 node ではエラーイベントは特別に扱われます. もしそのリスナーがなければ、デフォルトの動作はスタックトレースを出力してプログラムを終了することです。
となっています。エラーを定義しないといけないんですね。ちょっと修正しましょう。
for(var i = 2; i < len ; i++){ var ev = download(argv[i], i-2); // イベントハンドラ登録(エラーが出るはず) ev.on('hoge', function(index, res, buf){ downloadSite.add(index, res, buf); if(downloadSite.isFinish()){ downloadSite.showAll(); } }); ev.on('error', function(e){ console.log(e); }); }
実行しても何も起きませんでした。該当イベントがなかったらerrorイベントへ勝手に飛ばしてくれるわけではないみたいです。
と言うことは、try-catch内で手動でerrorイベントを呼ばないといけないのかな?と思ったのですが、これも違っていて、catchに入りませんでした。(正常終了しているということです)
動きを確認するときは小さなコードで確認しよう。
var EventEmitter = require('events').EventEmitter; var ev = new EventEmitter(); ev.on('fuga', function(){ console.log('call fuga function'); return false; }); var hogeResult = ev.emit('hoge', 1); console.log('result hoge %s', hogeResult); var fugaResult = ev.emit('fuga', 1); console.log('result fuga %s', fugaResult);
これを実行すると
$ node hoge.js result hoge false call fuga function result fuga true
ということは、定義されていないイベントを呼び出したときはemitの戻り値がfalseになります。
この戻り値を判断して、falseであればエラーイベントを発火させればOKということなのか…?
個人的には任意に起こすエラーじゃないから、例外をthrowしたほうが素直だと思うんだけどなぁ