C#で言うEventHandlerをjsで実装するにはどうしたらいいか考えてみました。
ブラウザ側のjsではUIオブジェクトにAddEventListenerが実装されているため、適当なオブジェクトを置いてしまえばそれで終わりです。
一方、Nodejs側ではどうなっているかというとEventEmitterなるものが実装されており、これを利用するのが一般的な様子。とはいえ検索しても資料があまり多くないので、Nodejsでイベント駆動するコーディングは少ないのかもしれません。
const { EventEmitter } = require('events');
const eventEmitter = new EventEmitter();
eventEmitter.on('error', args => console.log(args.message));
eventEmitter.emit('error', {
code: 111,
message: 'error occurred.',
});
eventEmitterという名前に慣れてないので違和感アリアリですが、処理の仕方はEventHandlerとそう変わらないです。
emitterが全てのイベントをハンドルし、onの第1引数でイベント種別が区別される点がjsチックですね。jQueryっぽいというか。
個人的にはErrorOccurredって名前のイベントハンドラーを定義したかったのですが、郷に入っては郷に従います。
ちなみに強引にEventHandlerっぽい何かを作るとすると、
function createEventHandler() {
const funcList = [];
const eventHandler = function () {
for (let i = 0; i < funcList.length; i++) {
funcList[i].apply(arguments);
}
};
eventHandler.add = function (func) {
funcList.push(func);
};
return eventHandler;
}
const errorOccurred = createEventHandler();
errorOccurred.add(args => console.log(args.message));
errorOccurred({
code: 111,
message: 'error occurred.',
});
こんな感じでしょうか。
上の例はエラー処理してなかったり、removeListenerがなかったりで実用には適しませんが、概ねこんな構造になると思います。どうしても必要ならその辺も自分で作るしかないですね。
コメント