1. 程式人生 > >Node.js-Node核心模組-events模組以及Node事件機制

Node.js-Node核心模組-events模組以及Node事件機制

 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'));