[第8回] Node.js イベントエミッター

Node.js

 

はじめに

 

皆さん。こんにちは! DreamHanksのエルムです。

今回はNode.js イベントエミッターについて説明していきます。

前回の記事は[第7回] Node.jsアプリケーションのデバッグです。

 

 

イベントエミッター

 

Node.jsでは、イベントモジュールを使用することで、カスタムイベントを簡単に作成、処理することができます。イベントモジュールには、カスタムイベントを発生させたり処理したりするために使用できるEventEmitterクラスが含まれています。

 

次の例では、カスタムイベントの発生と処理を行うEventEmitterクラスを示しています:

 

上記の例では、まず「events」モジュールをインポートし、EventEmitterクラスのオブジェクトを作成します。次に、on()関数を使用してイベントハンドラ関数を指定します。on()メソッドには、処理するイベントの名前と、イベントが発生したときに呼び出されるコールバック関数が必要です。

 

emit()関数は、指定されたイベントを発生させます。最初のパラメータは文字列としてのイベントの名前で、次に引数です。イベントは、0個以上の引数を指定して発生させることができます。emit()関数では、カスタムイベントに任意の名前を指定できます。

 

addListener()メソッドを使って、以下のようにイベントを購読することもできます。

 

次の表は、EventEmitterクラスのすべての重要なメソッドの一覧です:

 

EventEmitter メソッド 説明
emitter.addListener(event, listener) 指定されたイベントのリスナー配列の最後にリスナーを追加します。リスナーが既に追加されているかどうかのチェックは行われません。
emitter.on(event, listener) 指定されたイベントのリスナー配列の最後にリスナーを追加します。すでにリスナーが追加されているかどうかのチェックは行われません。emitter.addListener()のエイリアスとして呼び出すこともできます。
emitter.once(event, listener) イベントの1回限りのリスナーを追加します。このリスナーは、次にイベントが発生したときにのみ呼び出され、その後削除されます。
emitter.removeListener(event, listener) 指定されたイベントのリスナー配列からリスナーを削除します。注意:リスナーの後ろにあるリスナー配列の配列インデックスを変更します。
emitter.removeAllListeners([event]) すべてのリスナー、または指定されたイベントのリスナーを削除します。
emitter.setMaxListeners(n) デフォルトでは、EventEmittersは、特定のイベントに10以上のリスナーが追加された場合、警告を表示します。
emitter.getMaxListeners() emitter.setMaxListeners(n)で設定されるか、EventEmitter.defaultMaxListenersをデフォルトとする、エミッタの現在の最大リスナー値を返します。
emitter.listeners(event) 指定されたイベントのリスナーの配列のコピーを返します。
emitter.emit(event[, arg1][, arg2][, …]) 与えられた引数で指定されたイベントを発生させます。
emitter.listenerCount(type) イベントの種類を聞いているリスナーの数を返します。

 

 

イベントイミッターの共通パターン

 

Node.jsのEventEmitterクラスを使ってイベントを発生させたりバインドしたりするには、2つの一般的なパターンがあります。

  1. 関数からEventEmitterを返すこと
  2. EventEmitterクラスの拡張

 

関数からEventEmitterを返すこと

 

このパターンでは、コンストラクタ関数が EventEmitter オブジェクトを返します。この EventEmitter オブジェクトは、関数内でイベントを発するために使用されます。このEventEmitterオブジェクトは、イベントを購読するために使用することができます。次のような例を考えてみましょう。

 

結果:

 

上記の LoopProcessor() 関数では、まず EventEmitter クラスのオブジェクトを作成し、それを使用して ‘BeforeProcess’ と ‘AfterProcess’ イベントを発行します。最後に、この関数からEventEmitterのオブジェクトを返します。これで、LoopProcessor関数の戻り値を使用して、on()またはaddListener()関数を使用してこれらのイベントを結合することができます。

 

EventEmitterクラスの拡張

 

このパターンでは、EventEmitterクラスのコンストラクタ関数を拡張して、イベントを放出することができます。

 

結果:

 

上記の例では、Utilityモジュールのutil.inherits()メソッドを使用して、LoopProcessorのコンストラクタ関数をEventEmitterクラスで拡張しています。そのため、LoopProcessorオブジェクトでEventEmitterのメソッドを使用して、独自のイベントを処理することができます。

 

このようにして、EventEmitterクラスを使って、Node.jsでカスタムイベントを発生させたり処理したりすることができます。

 

 

終わりに

 

今回の記事は以上になります。

ご覧いただきありがとうございます。

 

 

コメント