如果你在浏览器中使用过JavaScript,你就知道用户的大部分交互是通过事件处理的:鼠标点击、键盘按键、对鼠标移动的反应等等。
在后台方面,Node为我们提供了使用events 模块建立一个类似系统的选择。
这个模块,特别是提供了EventEmitter ,我们将用它来处理我们的事件。
你使用这个语法初始化一个EventEmitter对象。
const EventEmitter = require('events')
const eventEmitter = new EventEmitter()
这个对象暴露了,除其他外,on 和emit 方法。
emit用于触发一个事件on用于添加一个回调函数,当事件被触发时,该函数将被执行。
发出和监听事件
例如,让我们创建一个start 事件,作为提供一个样本的问题,我们对该事件的反应只是记录到控制台。
eventEmitter.on('start', () => {
console.log('started')
})
当我们运行
eventEmitter.emit('start')
事件处理函数被触发,我们得到控制台日志。
addListener() 是 的别名,如果你看到它被使用的话。on()
向事件传递参数
你可以通过将参数作为附加参数传递给事件处理程序emit() 。
eventEmitter.on('start', (number) => {
console.log(`started ${number}`)
})
eventEmitter.emit('start', 23)
多个参数。
eventEmitter.on('start', (start, end) => {
console.log(`started from ${start} to ${end}`)
})
eventEmitter.emit('start', 1, 100)
只听一次事件
EventEmitter对象也暴露了once() 方法,你可以用它来创建一个一次性的事件监听器。
一旦该事件被触发,监听器就停止监听。
例子。
eventEmitter.once('start', () => {
console.log(`started!`)
})
eventEmitter.emit('start')
eventEmitter.emit('start') //not going to fire
删除一个事件监听器
一旦你创建了一个事件监听器,你可以使用removeListener() 方法将其删除。
要做到这一点,我们必须首先有一个对on 的回调函数的引用。
在这个例子中。
eventEmitter.on('start', () => {
console.log('started')
})
提取回调。
const callback = () => {
console.log('started')
}
eventEmitter.on('start', callback)
这样,以后你就可以调用
eventEmitter.removeListener('start', callback)
你也可以在一个事件上一次性删除所有监听器,使用。
eventEmitter.removeAllListeners('start')
获取注册的事件
eventNames() 方法,在EventEmitter对象实例上调用,返回一个字符串数组,代表在当前EventListener上注册的事件。
const EventEmitter = require('events')
const eventEmitter = new EventEmitter()
eventEmitter.on('start', () => {
console.log('started')
})
eventEmitter.eventNames() // [ 'start' ]
listenerCount() 返回作为参数传递的事件的监听者的数量。
eventEmitter.listenerCount('start') //1
在其他监听器之前/之后添加更多的监听器
如果你有多个监听器,它们的顺序可能很重要。
一个EventEmitter对象实例提供了一些方法来处理顺序。
emitter.prependListener()
当你使用on 或addListener 添加一个监听器时,它在监听器队列中被最后添加,并被最后调用。使用prependListener ,它将在其他监听器之前被添加和调用。
emitter.prependOnceListener()
当你使用once 添加一个监听器时,它在监听器队列中最后被添加,并且最后被调用。使用prependOnceListener ,它被添加,并在其他监听器之前被调用。