はじめに
皆さん。こんにちは! DreamHanksのエルムです。
今回はNode.js イベントエミッターについて説明していきます。
前回の記事は[第7回] Node.jsアプリケーションのデバッグです。
イベントエミッター
Node.jsでは、イベントモジュールを使用することで、カスタムイベントを簡単に作成、処理することができます。イベントモジュールには、カスタムイベントを発生させたり処理したりするために使用できるEventEmitterクラスが含まれています。
次の例では、カスタムイベントの発生と処理を行うEventEmitterクラスを示しています:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// イベントモジュールのEventEmitterクラスのリファレンス取得 var events = require('events'); //上記のリファレンスを使用して、EventEmitterクラスのオブジェクトを作成します。 var em = new events.EventEmitter(); //FirstEventに登録 em.on('FirstEvent', function (data) { console.log('最初の登録者 ' + data); }); // FirstEventを発生させる em.emit('FirstEvent', 'これは私の最初のNode.jsのイベントエミッタの例です。'); |
上記の例では、まず「events」モジュールをインポートし、EventEmitterクラスのオブジェクトを作成します。次に、on()関数を使用してイベントハンドラ関数を指定します。on()メソッドには、処理するイベントの名前と、イベントが発生したときに呼び出されるコールバック関数が必要です。
emit()関数は、指定されたイベントを発生させます。最初のパラメータは文字列としてのイベントの名前で、次に引数です。イベントは、0個以上の引数を指定して発生させることができます。emit()関数では、カスタムイベントに任意の名前を指定できます。
addListener()メソッドを使って、以下のようにイベントを購読することもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var emitter = require('events').EventEmitter; var em = new emitter(); //サブスクライブ FirstEvent em.addListener('FirstEvent', function (data) { console.log('最初の登録者: ' + data); }); //サブスクライブ SecondEvent em.on('SecondEvent', function (data) { console.log('最初の登録者: ' + data); }); // FirstEventを発生させる em.emit('FirstEvent', 'これは私の最初のNode.jsのイベントエミッタの例です。'); // SecondEventを発生させる em.emit('SecondEvent', '今回は、2つ目のNode.jsのイベントエミッタの例です。'); |
次の表は、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つの一般的なパターンがあります。
- 関数からEventEmitterを返すこと
- EventEmitterクラスの拡張
関数からEventEmitterを返すこと
このパターンでは、コンストラクタ関数が EventEmitter オブジェクトを返します。この EventEmitter オブジェクトは、関数内でイベントを発するために使用されます。このEventEmitterオブジェクトは、イベントを購読するために使用することができます。次のような例を考えてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var emitter = require('events').EventEmitter; function LoopProcessor(num) { var e = new emitter(); setTimeout(function () { for (var i = 1; i <= num; i++) { e.emit('BeforeProcess', i); console.log('処理番号:' + i); e.emit('AfterProcess', i); } } , 2000) return e; } var lp = LoopProcessor(3); lp.on('BeforeProcess', function (data) { console.log(data + 'のプロセスを開始しようとしています'); }); lp.on('AfterProcess', function (data) { console.log('処理完了 ' + data); }); |
結果:
1 2 3 4 5 6 7 8 9 |
1のプロセスを開始しようとしています 処理番号:1 処理完了 1 2のプロセスを開始しようとしています 処理番号:2 処理完了 2 3のプロセスを開始しようとしています 処理番号:3 処理完了 3 |
上記の LoopProcessor() 関数では、まず EventEmitter クラスのオブジェクトを作成し、それを使用して ‘BeforeProcess’ と ‘AfterProcess’ イベントを発行します。最後に、この関数からEventEmitterのオブジェクトを返します。これで、LoopProcessor関数の戻り値を使用して、on()またはaddListener()関数を使用してこれらのイベントを結合することができます。
EventEmitterクラスの拡張
このパターンでは、EventEmitterクラスのコンストラクタ関数を拡張して、イベントを放出することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
var emitter = require('events').EventEmitter; var util = require('util'); function LoopProcessor(num) { var me = this; setTimeout(function () { for (var i = 1; i <= num; i++) { me.emit('BeforeProcess', i); console.log('処理番号:' + i); me.emit('AfterProcess', i); } } , 2000) return this; } util.inherits(LoopProcessor, emitter) var lp = new LoopProcessor(3); lp.on('BeforeProcess', function (data) { console.log(data + 'のプロセスを開始しようとしています'); }); lp.on('AfterProcess', function (data) { console.log('処理完了 ' + data); }); |
結果:
1 2 3 4 5 6 7 8 9 |
1のプロセスを開始しようとしています 処理番号:1 処理完了 1 2のプロセスを開始しようとしています 処理番号:2 処理完了 2 3のプロセスを開始しようとしています 処理番号:3 処理完了 3 |
上記の例では、Utilityモジュールのutil.inherits()メソッドを使用して、LoopProcessorのコンストラクタ関数をEventEmitterクラスで拡張しています。そのため、LoopProcessorオブジェクトでEventEmitterのメソッドを使用して、独自のイベントを処理することができます。
このようにして、EventEmitterクラスを使って、Node.jsでカスタムイベントを発生させたり処理したりすることができます。
終わりに
今回の記事は以上になります。
ご覧いただきありがとうございます。
コメント