はじめに
http://nodejs.org/api/events.html
http://www.infoq.com/cn/articles/tyq-nodejs-event
イベントはnode.jsの最も重要なモジュールです。イベントモジュールは、Object Event.EventeMitterのみを提供します。 EventeMitterのコアは、イベントの発売とイベントリスナーです。
node.jsのほとんどのモジュールは、イベントモジュールから継承されます。
DOMツリーのイベントとは異なり、泡立ち、レイヤーごとのキャプチャなどのアクティビティはありません。
EventEmitterは、いくつかのイベントリスナーをサポートします。イベントが開始されると、このイベントに登録されたイベントリスナーが順番に呼び出され、イベントパラメーターはコールバック関数パラメーターとして渡されます。
アクセス方法:
コードコピーは次のとおりです。
require( 'events');
Emitter.on(イベント、リスナー)
コードコピーは次のとおりです。
/*
イベントモジュールを呼び出して、event.eventemitterオブジェクトを取得します
*/
var eventemitter = require( 'events')。eventemitter;
var ee = new eventemitter();
/*
eventemitter.on(イベント、リスナー)イベントのリスナーを登録します
パラメーター1:イベント文字列、イベント名
パラメーター2:コールバック関数
*/
ee.on( 'some_events'、function(foo、bar){
console.log( "1stリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
});
console.log( 'First Round');
ee.emit( 'some_events'、 'wilson'、 'zhong');
console.log( 'Second Round');
ee.emit( 'some_events'、 'wilson'、 'z');
eventemitter.on(イベント、リスナー)サンプルソースコード
emitter.emit(event、[arg1]、[arg2]、[...])
コードコピーは次のとおりです。
var eventemitter = require( 'events')。eventemitter;
var ee = new eventemitter();
ee.on( 'some_events'、function(foo、bar){
console.log( "1stリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
});
/*
eventemitter.emit(event、[arg1]、[arg2]、[...])は、指定されたイベントをトリガーします
パラメーター1:イベント文字列、イベント名
パラメーター2:オプションのパラメーター、コールバック関数のパラメーターを順番に渡す
返品値:このイベントが聴くかどうか
*/
var issuccess = ee.emit( 'some_events'、 'wilson'、 'zhong');
ee.on( 'some_events'、function(foo、bar){
console.log( "2回目のリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
});
ee.emit( 'some_events'、 'zhong'、 'wei');
var issuccess2 = ee.emit( 'other_events'、 'wilson'、 'zhong');
console.log(issuccess);
console.log(issuccess2);
Emitter.emit(event、[arg1]、[arg2]、[...])サンプルソースコード
この例では、3つのトリガーイベント操作を実行しました。この操作では、一部のイベントがリスニングを登録し、エミット関数は呼び出されたときにtrueを返しますが、他のeventsはリスニングを登録せず、エミット関数はfalsを返し、イベントがリスニングされないことを示します。もちろん、返品値を無視できます!
Emitter.Once(イベント、リスナー)
コードコピーは次のとおりです。
var eventemitter = require( 'events')。eventemitter;
var ee = new eventemitter();
/*
eventemitter.once(イベント、リスナー)イベントを1回のリスニングを登録し、トリガー後にリスニングを削除します
パラメーター1:イベント文字列、イベント名
パラメーター2:コールバック関数
*/
ee.once( 'some_events'、function(foo、bar){
console.log( "1stリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
});
console.log( 'First Round');
ee.emit( 'some_events'、 'wilson'、 'zhong');
console.log( 'Second Round');
var issuccess = ee.emit( 'some_events'、 'wilson'、 'zhong');
console.log(issuccess);
Emitter.Once(イベント、リスナー)サンプルソースコード
上記の例のコード実行結果から、emitter.onceを使用してsome_eventsのリスナーを登録した後、2ラウンドのcall emitter.emitでトリガーされ、第2ラウンドがfalseを返すことがわかります。これは、リスナーをEmitter.ONに登録することは、リスナーをEmitter.onを登録することとはわずかに異なることを意味します。
Emitter.Once登録リスニングは、1回限りのリスニングです。一度トリガーされると、リスニングが削除されます!もちろん、それは ^_ ^という名前からより明白です!
emitter.removelistener(イベント、リスナー)
最初に失敗したシーンを見てみましょう~~~
コードコピーは次のとおりです。
var eventemitter = require( 'events')。eventemitter;
var ee = new eventemitter();
ee.on( 'some_events'、function(foo、bar){
console.log( "1stリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
});
/*
APIでRemovelistener除去方法を見たとき、私はそれがこのようであるべきだと思いました
しかし、結果は^_^!!!
*/
ee.removelistener( 'some_events'、function(){
console.log( 'イベントを正常に削除しましたsome_eventsリスニング!');
});
console.log( 'First Round');
ee.emit( 'some_events'、 'wilson'、 'zhong');
Emitter.Removelistener(イベント、リスナー)サンプル障害シナリオソースコード
emitter.onを使用してsome_eventsのリスナーを登録したとき、emitter.removelistenerを使用してsome_eventsのリスナーを削除してから、emitter.emitを呼び出してトリガーしました。最後に、私が想像したように進行していないことがわかりました!なぜ?
当然、emiiter.removelistenerの2番目のパラメーターはコールバック関数であると思うので、APIは慎重に読む必要があります! ! !
別の成功したシーンを見てみましょう~~~
コードコピーは次のとおりです。
var eventemitter = require( 'events')。eventemitter;
var ee = new eventemitter();
varリスナー= function(foo、bar)
{
console.log( "1stリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
}
varリスナー2 = function(foo、bar)
{
console.log( "2回目のリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
}
varリスナー3 = function(foo、bar)
{
console.log( "3回目のリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
}
ee.on( 'some_events'、リスナー);
ee.on( 'some_events'、listerer2);
ee.on( 'some_events'、listerer3);
/*
eventemitter.removelistener(イベント、リスナー)は、指定されたイベントのリスナーを削除します
注:リスナーは登録する必要があります
PS:前の例の後、失敗します。大きな理由は、リスナーが無視されていることです。イベント名を渡すことは大丈夫だと思うのは自然なことなので、悲劇です!
*/
ee.removelistener( 'some_events'、リスナー);
ee.removelistener( 'some_events'、listerer3);
ee.emit( 'some_events'、 'wilson'、 'zhong');
Emitter.Removelistener(イベント、リスナー)サンプルの成功シナリオソースコード
執筆方法の例を使用し、3人のリスナーをsome_eventsに追加し、1番目と3番目のリスナーを削除し、最後にemitter.emitでsome_eventsをトリガーしました。出力の結果は、Emitter.Removelistenerで削除された最初と3番目のリスナーが機能しなくなったことを見つけるのは難しくありません。
もちろん、それは人々にとって有害です。 Emitter.Removelistenerの2番目のパラメーターは、削除が成功した後のコールバック関数ではなく、リスナーであることが削除されることがわかります...^_^!
emitter.removealllisteners([event])
Emitter.Removelistenerが使用されていますが、イベントには複数のリスナーができます。すべてを削除する必要がある場合、それは明らかにそれらを1つずつ削除する快適な方法ではなく、怠zyの性質に準拠していません!
Emitter.RemovealLlistenersによってもたらされた利便性を体験しましょう!
コードコピーは次のとおりです。
var eventemitter = require( 'events')。eventemitter;
var ee = new eventemitter();
varリスナー= function(foo、bar)
{
console.log( "1stリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
}
varリスナー2 = function(foo、bar)
{
console.log( "2回目のリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
}
ee.on( 'some_events'、リスナー);
ee.on( 'some_events'、listerer2);
ee.on( 'other_events'、function(foo、bar)
{
console.log( "その他のリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
});
/*
eventemitter.RemovealLlisteners([event])は、すべてのリスナーを削除します(バッチイベント)
パラメーター1:オプションのパラメーター、イベント文字列、イベント名
*/
ee.removealllisteners( 'some_events');
ee.emit( 'some_events'、 'wilson'、 'zhong');
ee.emit( 'other_events'、 'wilson'、 'zhong');
Emitter.RemovealLlistenersの例のイベント名パラメーターのソースコードの例
上記の実行結果を見ると、2人のリスナーがsome_eventsに登録されていることがわかります。 1人のリスナーがother_eventsに登録されました。 emitter.removealllistenersに電話して、some_eventsイベント名を渡しました。
最後に、emitter.on関数を使用して、some_eventsとother_eventsの2つのイベントをトリガーします。最後に、some_eventsによって登録された2人のリスナーは存在しませんが、他の_eventsが登録したリスナーはまだ存在します。
これは、Emitter.RemovealLlistenersがイベント名をパラメーターとして通過すると、イベント名に合格するすべてのリスナーが他のイベントリスナーに影響を与えることなく削除されることを意味します。
Emitter.RemovealLlistenersは、イベント名パラメーターを渡すことなく使用できます。直接実行します
コードコピーは次のとおりです。
var eventemitter = require( 'events')。eventemitter;
var ee = new eventemitter();
varリスナー= function(foo、bar)
{
console.log( "1stリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
}
varリスナー2 = function(foo、bar)
{
console.log( "2回目のリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
}
ee.on( 'some_events'、リスナー);
ee.on( 'some_events'、listerer2);
ee.on( 'other_events'、function(foo、bar)
{
console.log( "その他のリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
});
/*
eventemitter.RemovealLlisteners([event])は、すべてのリスナーを削除します(バッチイベント)
パラメーター1:オプションのパラメーター、イベント文字列、イベント名
*/
ee.removealllisteners();
ee.emit( 'some_events'、 'wilson'、 'zhong');
ee.emit( 'other_events'、 'wilson'、 'zhong');
emitter.removealllistenersパラメーターを渡すことなく、ソースコードのサンプルコード
サンプルコードは、emitter.removealllistenersを呼び出す場合、指定されたイベント名が渡されないことを除いて、パラメーターを渡すときとほぼ同じです。
結果を実行すると、some_eventsやその他の_eventsリスナーが存在しなくなり、すべてのリスナーが削除されます。 (より暴力的な方法は注意して使用する必要があります~~)
emitter.listeners(イベント)
コードコピーは次のとおりです。
var eventemitter = require( 'events')。eventemitter;
var ee = new eventemitter();
varリスナー= function(foo、bar)
{
console.log( "1stリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
}
varリスナー2 = function(foo、bar)
{
console.log( "2回目のリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
}
ee.on( 'some_events'、リスナー);
ee.on( 'some_events'、listerer2);
ee.on( 'other_events'、function(foo、bar)
{
console.log( "その他のリスニングイベント、パラメーターfoo =" + foo + "、bar =" + bar);
});
/*
eventemitter.listeners(event)//指定されたイベントのリスニング配列を返します
パラメーター1:イベント文字列、イベント名
*/
var siendereventsarr = ee.listeners( 'some_events');
console.log(ristenereventsarr.length)
for(var i = ristenereventsarr.length-1; i> = 0; i-){
console.log(ristenereventsarr [i]);
};
Emitter.Listeners(イベント)サンプルソースコード
some_eventsの2人のリスナーを登録し、emitter.listeners関数を呼び出し、some_eventsイベント名を渡し、関数返品値を受信します。
結果から、返品値は、some_eventsのすべての登録リスニングのコレクションを受信していることがわかります!
Emitter.setMaxListeners(n)
1つのイベントが複数のリスナーを追加できることは事実ですが、NodeJSのデフォルトの最大値は何ですか?
コードコピーは次のとおりです。
var eventemitter = require( 'events')。eventemitter;
var ee = new eventemitter();
/*
EventeMitterに11人のリスナーを追加します
*/
for(var i = 10; i> = 0; i-){
ee.on( 'some_events'、function()
{
console.log( 'th' +(i +1) +'リスナー');
});
};
nリスニングサンプルソースコードを追加します
上記の例では、ループを使用して11個のeventsを聴き、コードを実行して、警告情報が表示され、プロンプトがより詳細であることがわかりました。したがって、Emitter.setMaxListeners()を使用して制限を増やす必要があります。
コードコピーは次のとおりです。
var eventemitter = require( 'events')。eventemitter;
var ee = new eventemitter();
/*
eventemitter.setMaxListeners(n)EventEmitterの最大リスニングを設定します
パラメーター1:n番号タイプ、リスナーの最大数
10人以上のリスナーがいる場合、EventEmitterのリスナーの最大数がプロンプトされます。
(ノード)警告:可能性のあるイベントメモリリークが検出されました。 11人のリスナーが追加されました。
Emitter.setMaxListeners()を使用して制限を増やします。
デザイナーは、リスナーが多すぎるとメモリの漏れにつながる可能性があると考えているので、そのような警告があります
*/
ee.setMaxListeners(15);
/*
EventeMitterに11人のリスナーを追加します
*/
for(var i = 10; i> = 0; i-){
ee.on( 'some_events'、function()
{
console.log( 'th' +(i +1) +'リスナー');
});
};
Emitter.setMaxListenersサンプルソースコード
Emitter.setMaxListenersを呼び出して15に渡すと、コードが実行され、警告情報が表示されなくなります。
Emitter.SetMaxListenersの関数は、EventEmitterのリスナーの最大数を設定することです。この値を設定する必要がないように感じます。 10で十分でない場合が少ないはずです!
デザイナーは、リスナーが多すぎるとメモリリークを引き起こすと考えたので、警告を出しました!
他の...
より少ない場合は詳細に説明しません
eventemitter.defaultMaxListeners
eventemitter.defaultMaxListeners関数は、setMaxListenersに似ています。
すべてのEventemittersの最大リスニングを設定します
SetMaxListenersの優先度は、defaultmaxlistenersよりも大きいです
eventemitter.listenercount(emitter、event)
指定されたイベントのリスナーの数を返します
特別なイベントエラー
node.js開発ガイドからの引用:EventeMitterは、「エラー」のセマンティクスを含む特別なイベントエラーを定義します。通常、例外に遭遇したときにエラーイベントを放出します。エラーが発生すると、EventeMitterは、応答リスナーがない場合、node.jsが例外として扱い、プログラムを終了し、コールスタックを印刷することを指定します。通常、エラーイベントを発射するオブジェクトのリスナーをセットアップして、エラーに遭遇した後にプログラム全体がクラッシュするのを避ける必要があります。
イベントの継承
後でそれについて話しましょう。興味がある場合は、自分でhttp://nodejs.org/api/util.html#util_util_inherits_constructor_superconstuctor