イベントモジュールはノードのコアモジュールであり、http、fsなど、一般的に使用されるほとんどすべてのノードモジュールはイベントモジュールを継承します。この記事では、nodeJS のイベント メカニズムを詳しく紹介します
ほとんどの Node.js コア API は、特定の種類のオブジェクト (トリガーと呼ばれる) が名前付きイベントを定期的にトリガーする慣用的な非同期イベント駆動型アーキテクチャを採用しています。関数オブジェクト (リスナー) を呼び出します。たとえば、net.Server オブジェクトは新しい接続が確立されるたびにイベントをトリガーし、fs.ReadStream はファイルが開かれたときにイベントをトリガーします。ストリームはデータが読み取り可能になったときにイベントをトリガーします。
【EventEmitter】
EventEmitterクラスは、イベントモジュールによって定義され、開かれます。イベントをトリガーできるすべてのオブジェクトは、EventEmitterクラスのインスタンスです
var EventEmitter = require('events');/*{ [Function: EventEmitter] EventEmitter: [Circular], usingDomains: false, defaultMaxListeners: [Getter/Setter], init: [Function], listenerCount: [Function] } */console.log(EventEmitter);
イベントモジュールのEventEmitter属性は、モジュール自体を指します
var events = require('events'); console.log(events.EventEmitter === events);//true
EventEmitter は、イベント ジェネレーター エミッターのインスタンスを生成するために使用できるコンストラクターです
var EventEmitter = require('events');var emitter = new EventEmitter();/*EventEmitter { domain: null, _events: {}, _eventsCount: 0, _maxListeners: undefined } */console.log(emitter);
[emitter.emit(eventName[, ...args])]
eventName <any>...args <any>
このメソッドは、リスナーの登録シーケンスに基づいています。eventName という名前のイベントに登録された各リスナーは、指定されたパラメーターを渡して同期的に呼び出されます。イベントにリスナーがある場合はtrueを返し、そうでない場合はfalseを返す
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.on('test1',function(){}); console.log(emitter.emit('test1'));//trueconsole.log(emitter.emit('test2'));//false
【emitter.on(eventName,listener)】
このメソッドは、という名前のイベントのリスナー配列の最後にリスナー関数を追加するために使用されます。 eventName
eventName <any> 事件名 listener <Function> 回调函数
【注意】リスナーが追加されているかどうかはチェックしません。複数回呼び出して同じeventNameとlistenerを渡すと、リスナーが追加されて複数回呼び出されます
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }); emitter.on('test',function(){ console.log(2); }); emitter.emit('test');//1 2
このメソッドはEventEmitter参照を返し、チェーンで呼び出すことができます
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }).on('test',function(){ console.log(2); }); emitter.emit('test');//1 2
【emitter.addListener (eventName,listener) 】
emitter.on(eventName,listener)のエイリアス
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.addListener('test',function(){ console.log(1); }); emitter.emit('test');//1
【emitter.prependListener()】
on()メソッドとは異なり、prependListener()メソッドは次の目的で使用できます。イベントリスナーをリスナー配列に追加します Beginning
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }).prependListener('test',function(){ console.log(2); }); emitter.emit('test');//2 1
【emitter.once(eventName,listener)】
このメソッドは、eventName という名前のイベントに 1 回限りのリスナー関数を追加します。 次回eventNameイベントがトリガーされると、リスナーは削除されてから
eventName <any> 事件名 listener <Function> 回调函数
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }).once('test',function(){ console.log(2); }); emitter.emit('test');//1 2emitter.emit('test');//1
【emitter.prependOnceListener()】
このメソッドはリスナー配列の先頭にイベントリスナーを追加するために使用されます。次回、eventName イベントがトリガーされると、リスナーは削除され、その後、
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }).prependOnceListener('test',function(){ console.log(2); }); emitter.emit('test');//2 1emitter.emit('test');//1
【emitter.removeAllListeners([eventName])]
eventName <any>
を呼び出して、指定されたeventNameのすべてのリスナーまたはリスナーを削除して戻ります。 EventEmitter 参照は、チェーンで呼び出すことができます
[注意] 特に EventEmitter インスタンスが他のコンポーネントまたはモジュール (ソケットやファイル ストリームなど) によって作成されている場合、コード内の他の場所に追加されたリスナーを削除することは悪い習慣です
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }).removeAllListeners('test'); emitter.emit('test');//''
【emitter.removeListener(eventName,listener)】
eventName <any>listener
指定されたリスナーをeventNameというイベントのリスナー配列から削除します
var EventEmitter = require('events');var emitter = new EventEmitter();function show(){ console.log(1); } emitter.on('test',show).removeListener('test',show); emitter.emit('test');//''
[注意]removeListenerは指定されたリスナーのみをリスナーから削除します最大でもリスナー インスタンスを削除します。単一のリスナーが指定されたeventNameのリスナー配列に複数回追加される場合、removeListenerを複数回呼び出して各インスタンスを削除する必要があります。リスナーは順番にトリガーされます。これは、イベントの発生後、最後のリスナーの実行が終了する前に、removeListener() または RemoveAllListeners() を呼び出しても、それらのリスナーは Emit() から削除されないことを意味します。 後続のイベントは期待どおりに発生します
var EventEmitter = require('events');var emitter = new EventEmitter();function show(){ console.log(1); } emitter.on('test',show).on('test',show).removeListener('test',show); emitter.emit('test');//'1'
【emitter.eventNames】 ()]
var EventEmitter = require('events');var emitter = new EventEmitter();function show1(){ console.log(1); emitter.removeListener('test',show2); }function show2(){ console.log(2); } emitter.on('test',show1).on('test',show2); emitter.emit('test');//1 2emitter.emit('test');//1
【emitter.listenerCount(eventName)】
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.addListener('test1',function(){console.log(1);}); emitter.addListener('test2',function(){console.log(2);}); console.log(emitter.eventNames());//[ 'test1', 'test2' ]
eventNameという名前のイベントをリッスンしているリスナーの数を返します
eventName <any> 正在被监听的事件名
【emitter.listenerCount(eventName)】 listeners(eventName)]
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.addListener('test',function(){console.log(1);}); emitter.addListener('test',function(){console.log(1);}); console.log(emitter.listenerCount('test'));//2
eventName
eventName <any>
【emitter.getMaxListeners()】
返回 EventEmitter 当前的最大监听器限制值
var EventEmitter = require('events');var emitter = new EventEmitter(); console.log(emitter.getMaxListeners());//10
【emitter.setMaxListeners(n)】
默认情况下,如果为特定事件添加了超过 10 个监听器,则 EventEmitter 会打印一个警告。 此限制有助于寻找内存泄露。 但是,并不是所有的事件都要被限为 10 个。 emitter.setMaxListeners() 方法允许修改指定的 EventEmitter 实例的限制。 值设为 Infinity(或 0)表明不限制监听器的数量。返回一个 EventEmitter 引用,可以链式调用
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});/*Warning: Possible EventEmitter memory leak detected. 11 a listeners added. Use emitter.setMaxListeners() to increase limit */
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.setMaxListeners(11); emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
【EventEmitter.defaultMaxListeners】
每个事件默认可以注册最多10个监听器。单个EventEmitter实例的限制可以使用emitter.setMaxListeners(n)方法改变。所有EventEmitter实例的默认值可以使用EventEmitter.defaultMaxListeners属性改变
[注意]设置 EventEmitter.defaultMaxListeners 要谨慎,因为会影响所有EventEmitter 实例,包括之前创建的。因而,调用 emitter.setMaxListeners(n) 优先于 EventEmitter.defaultMaxListeners
var EventEmitter = require('events');var emitter = new EventEmitter(); EventEmitter.defaultMaxListeners = 11; emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
【'newListener' 事件】
eventName <any> 要监听的事件的名称 listener事件的句柄函数
EventEmitter 实例会在一个监听器被添加到其内部监听器数组之前触发自身的 'newListener' 事件
注册了 'newListener' 事件的监听器会传入事件名与被添加的监听器的引用。事实上,在添加监听器之前触发事件有一个微妙但重要的副作用: 'newListener' 回调中任何额外的被注册到相同名称的监听器会在监听器被添加之前被插入
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.on('newListener',function(){ console.log(2); }) emitter.on('test',function(){ console.log(1); }) emitter.emit('test');//2 1
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.on('test',function(){ console.log(1); }) emitter.on('newListener',function(){ console.log(2); }) emitter.emit('test');//1
【'removeListener' 事件】
eventName <any> 事件名 listener事件句柄函数
'removeListener' 事件在 listener 被移除后触发
var EventEmitter = require('events');var emitter = new EventEmitter();function show(){ console.log(1); } emitter.on('removeListener',function(){ console.log(2);//2}) emitter.on('test',show).removeListener('test',show);
var EventEmitter = require('events');var emitter = new EventEmitter();function show(){ console.log(1); } emitter.on('test',show).removeListener('test',show); emitter.on('removeListener',function(){ console.log(2);//''})
var EventEmitter = require('events');var emitter = new EventEmitter();function show(){ console.log(1); } emitter.removeListener('test',show); emitter.on('removeListener',function(){ console.log(2);//''})
以上がNodeJS イベントのイベントのチュートリアルの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。