Node EventEmitter的使用方法介绍

107 阅读2分钟

如果你在浏览器中使用过JavaScript,你就知道用户的大部分交互是通过事件处理的:鼠标点击、键盘按键、对鼠标移动的反应等等。

在后台方面,Node为我们提供了使用events 模块建立一个类似系统的选择。

这个模块,特别是提供了EventEmitter ,我们将用它来处理我们的事件。

你使用这个语法初始化一个EventEmitter对象。

const EventEmitter = require('events')
const eventEmitter = new EventEmitter()

这个对象暴露了,除其他外,onemit 方法。

  • 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()

当你使用onaddListener 添加一个监听器时,它在监听器队列中被最后添加,并被最后调用。使用prependListener ,它将在其他监听器之前被添加和调用。

emitter.prependOnceListener()

当你使用once 添加一个监听器时,它在监听器队列中最后被添加,并且最后被调用。使用prependOnceListener ,它被添加,并在其他监听器之前被调用。