大部分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的介紹。