events模組是node的核心模組,幾乎所有常用的node模組都繼承了events模組,例如http、fs等。本文將詳細介紹nodeJS中的事件機制
多數Node.js 核心API 都是採用慣用的非同步事件驅動架構,其中某些類型的對象(稱為觸發器)會週期性地觸發命名事件來呼叫函數物件(監聽器)。例如,一個net.Server物件會在每次有新連線時觸發一個事件;一個 fs.ReadStream 會在檔案開啟時觸發一個事件;一個 stream會在資料可讀時觸發事件。
【EventEmitter】
EventEmitter 類別由events 模組定義和開放的,所有能觸發事件的物件都是EventEmitter 類別的實例
var EventEmitter = require('events');/*{ [Function: EventEmitter] EventEmitter: [Circular], usingDomains: false, defaultMaxListeners: [Getter/Setter], init: [Function], listenerCount: [Function] } */console.log(EventEmitter);
# events模組的EventEmitter屬性指向該模組本身
var events = require('events'); console.log(events.EventEmitter === events);//true
EventEmitter是一個建構函數,可以用來產生事件產生器的實例emitter
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)】
該方法用於新增listener函數到名為eventName的事件的監聽器陣列的結尾
eventName <any> 事件名 listener <Function> 回调函数
[注意]不會檢查listener是否已被新增。多次呼叫並傳入相同的eventName和listener會導致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()方法可用於將事件監聽器新增至監聽器陣列的開頭
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)】
此方法新增一個單次listener 函式到名為eventName 的事件。 下次觸發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 實例是其他元件或模組(如socket 或檔案流)所建立的
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 的事件的監聽器陣列中移除指定的listener
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才能移除每個實例
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'
[注意]一旦一個事件被觸發,所有綁定到它的監聽器都會依序依序觸發。這意味著,在事件觸發後、最後一個監聽器完成執行之前,任何 removeListener() 或 removeAllListeners() 呼叫都不會從 emit() 中移除它們。 隨後的事件會像預期的那樣發生
因為監聽器是使用內部數組進行管理的,所以調用它會改變在監聽器被移除後註冊的任何監聽器的位置索引。 雖然這不會影響監聽器的呼叫順序,但意味著由emitter.listeners() 方法傳回的監聽器陣列副本需要被重新建立
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.eventNames()】
傳回一個列出觸發器已註冊監聽器的事件的陣列。 陣列中的值為字串或符號
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' ]
【emitter.listenerCount(eventName)】
eventName <any> 正在被监听的事件名
傳回正在監聽名為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
【emitter.listeners(eventName)】
eventName <any>
傳回名為eventName 的事件的監聽器陣列的副本
var EventEmitter = require('events');var emitter = new EventEmitter(); emitter.addListener('test',function(){console.log(1);}); emitter.addListener('test',function(){console.log(2);}); console.log(emitter.listeners('test'));//[ [Function], [Function] ]emitter.listeners('test')[0]();//1
【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事件中events的實例教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!