EventEmitterはいつ使うの?
非同期のJavaScriptにはCallbackパタンがよく使われてる。Node.js開発経験のある方ならわかると思うが、処理が長くなると、コードが階段状になりがちなのだ:
Callbackの処理が簡単な場合は、この階段状のコードでも特に問題ないだが、もし複雑の処理になると、かなり読みづらい。そこで、EventEmitter
を使って処理結果をEventとして外に出すのが解決方の一つ。
EventEmitterの使い方
EventEmitter
はnode.jsevents
モジュールの中に入ってる。EventEmitter
を継承することで、on
とemit
メソードでEventの受け取りと転送ができる。サンプルを作成してみよう:
このDirReader
モジュールは下記のように使える:
処理結果をイベント形式で外に出すと、複雑な処理をやってもコードの可読性を保てる。実はnode.jsのapiにもこのパターンが大量に使われている。例えば、streamとか〜
on
のほかにはonce
というメーソドがある。on
と違って、once
はそのイベントを一回だけ受け取って、そのあと同じイベントが転送してきたら、無視するという挙動になる。
EventEmitterの応用
EventEmitter
を使う理由は、コードの可読性がよくなるだけじゃなく、同じイベントに複数の処理が行えるというメリットもある。例えば先ほどのサンプルで、DirReader
で読み出したデータをconsoleに出す同時に、データベースにも保存したい場合はどうするんだろう?もう一個on
を作ってdata
イベントを購読すれば良いのだ:
簡単でしょ?もちろん、consoleに出すなら、on
を一個用意するほどでもないが、ニュアンスが伝えられたらと思う。
まとめ
EventÉmitter
を使うことで、コードが読みやすくなるし、今後システムの拡張などにも十分な柔軟性を持つので、node.jsでの開発を次のレベルに向かうなら、ぜひEventEmitter
を活用してください。