情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでイベントを使用する

イベントを使用するにはevents.EventEmitterクラスを使用します。

var events = require('events');

var eventEmitter = new events.EventEmitter();

以後events.EventEmitterクラスのインスタンスをeventEmitterと表記します。

イベントの発生

イベントを発生させるにはeventEmitter.emit関数を使用します。

var b = eventEmitter.emit('xxx', 'yyy', 'zzz');

第1引数にイベント名を指定します。

第2引数以降にイベントの引数を指定します。

返り値としてイベントにイベントハンドラが登録されていたかが真偽値として得られます。

イベントが発生するとイベントに登録されているイベントハンドラが登録された順番で呼び出されます。この時、イベントの引数がイベントハンドラに渡されます。

イベントハンドラに渡される引数は全てのイベントハンドラで同じものであることに注意してください。

つまり、イベントハンドラでイベントの引数の内容を変更した場合にはその変更はそれ以降に呼び出されるイベントハンドラにも反映されます

イベントハンドラの登録

イベントにイベントハンドラを登録するにはeventEmitter.on関数かeventEmitter.addListener関数を使用します。

var eh = function (arg1, arg2) {
};
eventEmitter.on('xxx', eh);
eventEmitter.addListener('xxx', eh);

第1引数にイベント名を指定します。

第2引数にイベントハンドラを関数として指定します。この関数の引数はイベントの引数です。

同じイベントハンドラを複数回登録することもできます。その場合、イベントが発生した場合には同じイベントハンドラが複数回呼び出されることになります。

イベントハンドラの登録解除

イベントからイベントハンドラを登録解除するにはeventEmitter.removeListener関数を使用します。

eventEmitter.removeListener('xxx', eh);

第1引数にイベント名を指定します。

第2引数にイベントハンドラを関数として指定します。

同じイベントハンドラが複数回登録されている場合には最後のもののみが登録解除されます。

全てのイベントハンドラの登録解除

イベントから全てのイベントハンドラを登録解除するにはeventEmitter.removeAllListeners関数を使用します。

eventEmitter.removeAllListeners('xxx');

第1引数にイベント名を指定します。

サンプルコード1

event-emitter.js

var events = require('events');

var eh1 = function (p) {
    console.log(p.name + ' ' + p.age);
};
var eh2 = function (p) {
    console.log('new person.');

    p.age = 0;
};

var eventEmitter = new events.EventEmitter();
eventEmitter.emit('new', { name: 'nakata', age: 25 });
eventEmitter.on('new', eh1);
eventEmitter.on('new', eh2);
eventEmitter.emit('new', { name: 'yamaguti', age: 15 });
eventEmitter.on('new', eh1);
eventEmitter.emit('new', { name: 'sasaki', age: 17 });
eventEmitter.removeListener('new', eh1);
eventEmitter.emit('new', { name: 'nakamura', age: 37 });
eventEmitter.removeAllListeners('new');
eventEmitter.emit('new', { name: 'takeuti', age: 51 });

実行結果

C:\work\node>node event-emitter.js
yamaguti 15
new person.
sasaki 17
new person.
sasaki 0
nakamura 37
new person.

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js