node.js常用內(nèi)置模塊--Events

大部分Node.js核心API是圍繞一個慣用的異步事件驅(qū)動體系結(jié)構(gòu)構(gòu)建的,在這種體系結(jié)構(gòu)中,某些類型的對象(稱為“發(fā)射器(emitters)”)發(fā)出命名事件,從而導(dǎo)致函數(shù)對象(“偵聽器(listeners)”)被調(diào)用。

所有發(fā)出事件的對象都是EventEmitter類的實(shí)例。通常,事件名稱是大小寫為駝峰大小寫的字符串,但可以使用任何有效的JavaScript屬性鍵。當(dāng)EventEmitter對象發(fā)出事件時,所有附加到該特定事件的函數(shù)都將被同步調(diào)用。被調(diào)用的偵聽器返回的任何值都將被忽略和丟棄。

下面通過一些例子來了解EventEmitter對象的使用。更多的使用方法可以直接查看官網(wǎng)對于Events的介紹。

一、引入EventEmitter對象

const EventEmitter = require('events');

二、創(chuàng)建EventEmitter對象

// 創(chuàng)建EventEmitter對象
const emitter = new EventEmitter();

三、基本使用

1. 監(jiān)聽事件 emitter.on(eventName, listener)
// 監(jiān)聽click事件
emitter.on('click', (e) => {
   console.log('監(jiān)聽到了click點(diǎn)擊', e); //監(jiān)聽到了click點(diǎn)擊 { name: 'Click-Passer', age: 18 }
})
2.發(fā)送事件 emitter.emit(eventName[, ...args])

發(fā)送事件可以攜帶一些參數(shù),下面的例子就是攜帶了{(lán)name: 'Click-Passer', age: 18}

setTimeout(() => {
   emitter.emit('click', {name: 'Click-Passer', age: 18})
}, 2000)
3.移除事件 emitter.off(eventName, listener)

它是v10.0.0增加的方法,是 emitter.removeListener()的別名

function b(e) {
   console.log('監(jiān)聽到了tap點(diǎn)擊', e); //監(jiān)聽到了tap點(diǎn)擊 { name: 'Tap-Passer', age: 28 }
}
//開始監(jiān)聽tap事件
emitter.on('tap', b)

//發(fā)送tap事件,并傳送了參數(shù) {name: 'Tap-Passer', age: 28}
//emitter.emit('tap')
emitter.emit('tap', {name: 'Tap-Passer', age: 28})

//移除事件
emitter.off('tap', b)

三、常見的屬性

EventEmitter的實(shí)例有一些屬性,可以獲取相關(guān)的信息。

  • emitter.eventNames()

獲取當(dāng)前 EventEmitter對象注冊的事件字符串?dāng)?shù)組。

const names = emitter.eventNames()
console.log(names);  //[ 'click', 'tap']
  • emitter.getMaxListeners()

獲取當(dāng)前EventEmitter對象的最大監(jiān)聽器數(shù)量,默認(rèn)10。

 const maxListeners = emitter.getMaxListeners()
 console.log(maxListeners); // 10
  • emitter.setMaxListeners()

修改當(dāng)前EventEmitter對象的最大監(jiān)聽器數(shù)量。

// 修改最大監(jiān)聽器數(shù)量
 emitter.setMaxListeners(30)
  • emitter.listeners(eventName)

獲取當(dāng)前EventEmitter對象某個事件監(jiān)聽器上所有的監(jiān)聽器數(shù)組.

const listeners = emitter.listeners('click')
console.log(listeners); //[ [Function]]

//根據(jù)返回值方法也可以調(diào)用
 listeners[0](33) ; // //監(jiān)聽到了click點(diǎn)擊 33

  • emitter.listenerCount(eventName)

獲取當(dāng)前 EventEmitter對象某一個事件名稱,監(jiān)聽器的個數(shù);

   const clickCount = emitter.listenerCount('click')
   console.log(clickCount); // 1

四、其他常用方法

  • emitter.once(eventName, listener)

當(dāng)前 EventEmitter對象的某一個監(jiān)聽事件只會監(jiān)聽一次。

emitter.once('once', (e) => {
   console.log('只監(jiān)聽一次的被調(diào)用了', e);
})

setTimeout(() => {
    emitter.emit('once', {name: 'Once-Passer', age: 38})
    emitter.emit('once', {name: 'Once-Passer'})
}, 2000)
  • emitter.prependListener(eventName, listener)

當(dāng)前 EventEmitter對象將某個監(jiān)聽事件添加到最前面 ,是對于相同eventName監(jiān)聽事件。

emitter.prependListener('click', (e) => {
   console.log('將監(jiān)聽事件添加到最前面', e);
})
setTimeout(() => {
   emitter.emit('click', {name: 'Click-Passer', age: 18})
},2000)
//將監(jiān)聽事件添加到最前面 { name: 'Click-Passer', age: 18 }
//監(jiān)聽到了click點(diǎn)擊 { name: 'Click-Passer', age: 18 }

  • emitter.prependOnceListener(eventName, listener)

當(dāng)前 EventEmitter對象將某個監(jiān)聽事件添加到最前面且只調(diào)用一次

emitter.prependOnceListener('click', (e) => {
   console.log('將監(jiān)聽事件添加到最前面且只監(jiān)聽一次', e);
})
setTimeout(() => {
   emitter.emit('click', {name: 'Click-Passer', age: 18})
},2000)

//將監(jiān)聽事件添加到最前面且只監(jiān)聽一次 { name: 'Click-Passer', age: 18 }
//將監(jiān)聽事件添加到最前面 { name: 'Click-Passer', age: 18 }
//監(jiān)聽到了click點(diǎn)擊 { name: 'Click-Passer', age: 18 }

從輸出可以看出,同一個eventName他們調(diào)用順序 prependOnceListener -> prependListener -> on

  • emitter.removeAllListeners([eventName])

當(dāng)前 EventEmitter對象移除所有的監(jiān)聽器

//移除所有的監(jiān)聽器
emitter.removeAllListeners()

// 移除emitter上的click事件監(jiān)聽
emitter.removeAllListeners("click");

更多的使用方法可以直接查看官網(wǎng)對于Events的介紹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容