Latest web development tutorials

Node.jsを持つEventEmitter

Node.jsの完了時に、すべての非同期I / O操作は、イベントキューにイベントを送信します。

多くのオブジェクトが配布されているNode.jsのイベント:イベントnet.Server分散オブジェクトたびに新しい接続、fs.readStreamオブジェクトは、ファイルを開いた場合に発行されます。 これらのオブジェクトのすべてがevents.EventEmitterインスタンスイベントが生成されます。


持つEventEmitterクラス

events.EventEmitter:イベントモジュールは、オブジェクトを1つだけ提供します。 コア持つEventEmitterは、イベントトリガ、イベントリスナー関数のパッケージです。

モジュールにアクセスするために、あなたが必要とすることにより、(「イベント」)することができます。

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

持つEventEmitterオブジェクトをインスタンス化するときにエラーが発生した場合、それは「エラー」イベントがトリガされます。 新しいリスナーを追加する場合は、「newListener 'イベントはリスナーが除去されたときに、「のremoveListener」イベントがトリガされたトリガされます。

ここでは、簡単な例が持つEventEmitter使用状況を示して使用します。

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
	console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
	event.emit('some_event'); 
}, 1000); 

次のように実行結果は以下のとおりです。

このコード、コンソール出力」some_event・トリガ・イベント」の後に1秒を実行します 原則は、オブジェクトが、リスナーのイベントsome_eventイベントを登録され、その後、私たちはその後、some_eventリスナーを呼び出し、1000ミリ秒オブジェクト内のイベントの後にsetTimeoutメソッドによってsome_eventイベントを送信することです。

$ node event.js 
some_event 事件触发

イベント名とパラメータの数によって各イベント持つEventEmitter、イベント名は文字列で、通常は特定の意味を表明しました。 イベントごとに、持つEventEmitterは、いくつかのイベントリスナーをサポートしています。

イベントが発生すると、イベントリスナーを登録するイベントを順次コールバック・イベントのパラメータ引数として呼ばれています。

このプロセスを示し、私たちは、次の例を見てみましょう:

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

上記のコードを実行し、次のように実行します。

$ node event.js 
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

イベントに登録上の例では、エミッタsomeEvent、2つのイベントリスナー、その後someEventイベントをトリガしました。

営業成績はと呼ばれている2つのイベントリスナーコールバック関数の中で見ることができます。 これが持つEventEmitter最も簡単な使い方です。

持つEventEmitterは、以下のような上および放出する属性の数を、提供します 機能上のイベント機能を結合するために使用され放射属性は、イベントをトリガするために使用されます。 次に、説明持つEventEmitter特定のプロパティを見てください。

ウェイ

いいえ。 メソッドと説明
1 addListener(イベント、リスナー)
配列の最後に指定したイベントリスナーのリスナーを追加します。
2 (イベント、リスナー)に
リスナーを登録するには、指定されたイベントの文字列イベントとコールバック関数を受け入れます。
server.on('connection', function (stream) {
  console.log('someone connected!');
});
3 一度(イベント、リスナー)
ほとんどのリスナーが直ちにトリガリスナーを解放した後、一度トリガすることは、指定されたイベントのための単一のリスナーを登録します。
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
4 removeListener(イベント、リスナー)
リスナーに指定されたイベントを削除し、リスナーがイベントが登録されたリスナーがあるでなければなりません。
var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
5 removeAllListeners([イベント])
すべてのイベントのすべてのリスナーを削除し、指定したイベント場合は、すべてのリスナーのために指定されたイベントを削除します。
6 setMaxListeners(N)
デフォルトでは、持つEventEmitterあなたは10意志の警告メッセージを出力の上にリスナーを追加する場合。 setMaxListeners関数は、デフォルトの制限のリスナーの数を増加させるために使用されます。
7 リスナー(イベント)
指定したイベントのリスナーの配列を返します。
8 発光する(イベント、[引数1]、 [ARG2]、[...])
登録されたイベントリスナーがあるかどうかを各リスナーの実行順序パラメータは、そうでない場合はfalseを返し、trueを返します。

クラスメソッド

いいえ。 メソッドと説明
1 listenerCount(エミッタ、イベント)
指定したイベントのリスナーの数を返します。

イベント

いいえ。 イベント&説明
1 newListener
  • イベント-イベントの文字列名

  • リスナー-イベント処理機能

あなたは新しいリスナーを追加すると、イベントがトリガされます。

2 removeListener
  • イベント-イベントの文字列名

  • リスナー-イベント処理機能

指定されたリスナー配列からリスナーを削除します。 これはインデックスに変更されますが、リスナーリスナー後に削除したことです。

コネクション(接続)イベントを介して、次の例は、持つEventEmitterクラスのアプリケーションを示しています。

次のように、main.jsファイルのファイルを作成します。

var events = require('events');
var eventEmitter = new events.EventEmitter();

// 监听器 #1
var listener1 = function listener1() {
   console.log('监听器 listener1 执行。');
}

// 监听器 #2
var listener2 = function listener2() {
  console.log('监听器 listener2 执行。');
}

// 绑定 connection 事件,处理函数为 listener1 
eventEmitter.addListener('connection', listener1);

// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

// 处理 connection 事件 
eventEmitter.emit('connection');

// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");

// 触发连接事件
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

console.log("程序执行完毕。");

次のように上記のコードは、実行結果は以下のとおりです。

$ node main.js
2 个监听器监听连接事件。
监听器 listener1 执行。
监听器 listener2 执行。
listener1 不再受监听。
监听器 listener2 执行。
1 个监听器监听连接事件。
程序执行完毕。

エラー事象

持つEventEmitterは、それが意味的エラーが含まれている、特別なイベントエラーを定義して、我々は通常、例外の顔にエラーイベントをトリガーします。

エラーがトリガされると、持つEventEmitterは、リスナーへの応答がない場合は、Node.jsのは、エラーメッセージを表示してプログラムを終了し、例外としてそれを使用することを規定しています。

我々は、一般的に、エラーイベントリスナーの設定をトリガーするターゲットにするには、エラーがプログラムがクラッシュ全体で遭遇することは避けてください。 例えば:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error'); 

次のエラーが表示されます実行します。

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
Error: Uncaught, unspecified 'error' event. 
at EventEmitter.emit (events.js:50:15) 
at Object.<anonymous> (/home/byvoid/error.js:5:9) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40) 

継承持つEventEmitter

時間のほとんどは、我々が直接持つEventEmitterを使用しますが、オブジェクトにそれを継承していません。 限りサポートインシデント対応コアモジュールが持つEventEmitterのサブクラスであるとして、含むFS、ネットは、http、を含みます。

なぜでしょうか? 2つの理由があります。

まず、オブジェクトはエミッションモニターとセマンティクスを満たすイベントの物理的な実現の機能を持って、イベントがオブジェクトでなければなりません。

第二に、オブジェクトメカニズムJavaScriptはプロトタイプベースの、マルチパートのサポートの継承、元の継承を中断しませ持つEventEmitterオブジェクトです。