Node.js-Node核心模組-events模組以及Node事件機制
阿新 • • 發佈:2018-12-11
5. envents node事件機制
所有能觸發事件的物件都是enventEmitter類的例項。這些物件開發了一個enventEmitter.on()函式,允許將一個或者多個函式繫結到會被物件觸發的命名事件上,事件名稱通常是駝峰式的字串,但也可以使用任何有效的javascript屬性名。
(1)EventEmitter類
- EventEmitter.defaultMaxListeners ---每個事件可註冊的監聽器最大數量
// 匯入模組 const eventEmitter = require('events'); console.log('每個事件可註冊的監聽器最大數量'+eventEmitter.defaultMaxListeners); /* * dom繫結的監聽事件:可新增多個監聽器 * dom.addEventListenner('click',fn) * dom.addEventListenner('click',fn) * dom.addEventListenner('click',fn) * */
(2)事件(emitter物件)
- newListener ---內建事件,自動觸發監聽器
// 匯入模組 const eventEmitter = require('events'); // 例項化,emitter:監聽事件和出發事件 const emitter = new eventEmitter(); // 內建事件,自動觸發 emitter.on('newListener',function (event,listner) { console.log(event+'添加了新的監聽器'); }); // 監聽事件 或 新增aa監聽器 emitter.on('a',function () { console.log('a觸發1'); }); emitter.on('a',function () { console.log('a觸發2'); }); emitter.on('a',function () { console.log('a觸發3'); }); //手動觸發事件 emitter.emit('aa');
- removeListener
// 匯入模組 const eventEmitter = require('events'); // 例項化,emitter:監聽事件和出發事件 const emitter = new eventEmitter(); // 移除事件監聽器 emitter.on('removeListener',function (event) { console.log(event+'監聽器被移除'); }); // 監聽事件 或 新增aa監聽器 emitter.on('a',function () { console.log('a觸發1'); }); emitter.on('a',function () { console.log('a觸發2'); }); emitter.on('a',function () { console.log('a觸發3'); }); // 移除移除事件 emitter.removeListeners('a');//移除所有的事件的監聽器,輸出: // a監聽器被移除 // a監聽器被移除 // a監聽器被移除 emitter.removeAllListeners();//輸出:newListener監聽器被移除 // a監聽器被移除 // a監聽器被移除 // a監聽器被移除
(3)屬性(emitter物件)
- Emitter.on() --新增事件監聽器
- Emitter.addListener() ---on()方法的別名
- Emitter.once() ---事件只能觸發一次
// 匯入模組
const eventEmitter = require('events');
// 例項化,emitter:監聽事件和出發事件
const emitter = new eventEmitter();
emitter.once('b',function () {
console.log('b觸發1');
});
emitter.emit('b');
emitter.emit('b');//輸出都是一個'b觸發1'
- Emitter.prependListener() ---優先載入
- Emitter.prependOnceListener() ---優先載入
例子:
// 匯入模組
const eventEmitter = require('events');
// 例項化,emitter:監聽事件和出發事件
const emitter = new eventEmitter();
// 監聽事件 或 新增aa監聽器
emitter.on('a',function () {
console.log('a觸發1');
});
emitter.on('a',function () {
console.log('a觸發2');
});
emitter.on('a',function () {
console.log('a觸發3');
});
emitter.prependListener('a',function () {
console.log('prependListener:a被觸發了');
});
//手動觸發事件
emitter.emit('a');/* prependListener:a被觸發了;a觸發1;a觸發2;a觸發3*/
- Emitter.emit() ---觸發事件
- Emitter.removeAllListeners(eventName) --移除事件
- Emitter.removeListener(eventName,listener) --移除指定事件的指定監聽器
- Emitter.enventNames() --事件監聽列表
// 匯入模組
const eventEmitter = require('events');
// 例項化,emitter:監聽事件和出發事件
const emitter = new eventEmitter();
// 監聽事件 或 新增aa監聽器
emitter.on('a',function () {
console.log('a觸發1');
});
emitter.once('b',function () {
console.log('b觸發1');
});
//手動觸發事件
emitter.emit('a');
console.log(emitter.eventNames('a'));//輸出[ 'a', 'b' ]
- Emitter.getMaxListeners() ---獲取監聽器
- Emitter.setMaxListeners() ---設定監聽器數
emitter.setMaxListeners(15);
console.log(emitter.getMaxListeners());//15
- Emitter.listenerCount(eventName) ---
- Emitter.listeners(enventName) ---獲取監聽器數量
console.log(emitter.listenerCount('a'));