EventHandler(EventEmitter)を実装する(javascript/nodejs)

JavaScript

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がなかったりで実用には適しませんが、概ねこんな構造になると思います。どうしても必要ならその辺も自分で作るしかないですね。

コメント