大部分Node.js核心API是围绕一个惯用的异步事件驱动体系结构构建的,在这种体系结构中,某些类型的对象(称为“发射器(emitters
)”)发出命名事件,从而导致函数对象(“侦听器(listeners
)”)被调用。
所有发出事件的对象都是EventEmitter
类的实例。通常,事件名称是大小写为驼峰大小写的字符串,但可以使用任何有效的JavaScript属性键
。当EventEmitter
对象发出事件时,所有附加到该特定事件的函数都将被同步调用。被调用的侦听器返回的任何值都将被忽略和丢弃。
下面通过一些例子来了解EventEmitter
对象的使用。更多的使用方法可以直接查看官网对于Events的介绍。
一、引入EventEmitter
对象
const EventEmitter = require('events');
二、创建EventEmitter
对象
// 创建EventEmitter对象
const emitter = new EventEmitter();
三、基本使用
1. 监听事件 emitter.on(eventName, listener)
// 监听click事件
emitter.on('click', (e) => {
console.log('监听到了click点击', e); //监听到了click点击 { name: 'Click-Passer', age: 18 }
})
2.发送事件 emitter.emit(eventName[, ...args])
发送事件可以携带一些参数,下面的例子就是携带了{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('监听到了tap点击', e); //监听到了tap点击 { name: 'Tap-Passer', age: 28 }
}
//开始监听tap事件
emitter.on('tap', b)
//发送tap事件,并传送了参数 {name: 'Tap-Passer', age: 28}
//emitter.emit('tap')
emitter.emit('tap', {name: 'Tap-Passer', age: 28})
//移除事件
emitter.off('tap', b)
三、常见的属性
EventEmitter
的实例有一些属性,可以获取相关的信息。
-
emitter.eventNames()
获取当前 EventEmitter
对象注册的事件字符串数组。
const names = emitter.eventNames()
console.log(names); //[ 'click', 'tap']
-
emitter.getMaxListeners()
获取当前EventEmitter
对象的最大监听器数量,默认10。
const maxListeners = emitter.getMaxListeners()
console.log(maxListeners); // 10
-
emitter.setMaxListeners()
修改当前EventEmitter
对象的最大监听器数量。
// 修改最大监听器数量
emitter.setMaxListeners(30)
-
emitter.listeners(eventName)
获取当前EventEmitter
对象某个事件监听器上所有的监听器数组.
const listeners = emitter.listeners('click')
console.log(listeners); //[ [Function]]
//根据返回值方法也可以调用
listeners[0](33) ; // //监听到了click点击 33
-
emitter.listenerCount(eventName)
获取当前 EventEmitter
对象某一个事件名称,监听器的个数;
const clickCount = emitter.listenerCount('click')
console.log(clickCount); // 1
四、其他常用方法
-
emitter.once(eventName, listener)
当前 EventEmitter
对象的某一个监听事件只会监听一次。
emitter.once('once', (e) => {
console.log('只监听一次的被调用了', e);
})
setTimeout(() => {
emitter.emit('once', {name: 'Once-Passer', age: 38})
emitter.emit('once', {name: 'Once-Passer'})
}, 2000)
-
emitter.prependListener(eventName, listener)
当前 EventEmitter
对象将某个监听事件添加到最前面 ,是对于相同eventName监听事件。
emitter.prependListener('click', (e) => {
console.log('将监听事件添加到最前面', e);
})
setTimeout(() => {
emitter.emit('click', {name: 'Click-Passer', age: 18})
},2000)
//将监听事件添加到最前面 { name: 'Click-Passer', age: 18 }
//监听到了click点击 { name: 'Click-Passer', age: 18 }
-
emitter.prependOnceListener(eventName, listener)
当前 EventEmitter
对象将某个监听事件添加到最前面且只调用一次
emitter.prependOnceListener('click', (e) => {
console.log('将监听事件添加到最前面且只监听一次', e);
})
setTimeout(() => {
emitter.emit('click', {name: 'Click-Passer', age: 18})
},2000)
//将监听事件添加到最前面且只监听一次 { name: 'Click-Passer', age: 18 }
//将监听事件添加到最前面 { name: 'Click-Passer', age: 18 }
//监听到了click点击 { name: 'Click-Passer', age: 18 }
从输出可以看出,同一个eventName
他们调用顺序 prependOnceListener -> prependListener -> on
-
emitter.removeAllListeners([eventName])
当前 EventEmitter
对象移除所有的监听器
//移除所有的监听器
emitter.removeAllListeners()
// 移除emitter上的click事件监听
emitter.removeAllListeners("click");
更多的使用方法可以直接查看官网对于Events的介绍。