Node.js中的events模块

  在Node.js(以下简称node)中,有一个events模块,中文名称是“事件触发器”。node的一大特点就是事件驱动。在node里,很多行为都会触发相应的事件,而所有能触发事件的对象都是events模块类的实例,它们都有添加事件的能力。

on()

  先看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const events = require('events')

class MyEvent extends events { }
const myevent = new MyEvent()
// 注册监听器
myevent.on('event1', function (a) {
console.log('event' + a)
})
// 使用ES6箭头函数注册监听器
myevent.on('event2', (a) => {
console.log('event' + a)
})
// emit()触发事件
myevent.emit('event1', 1)
myevent.emit('event2', 2)

  上面的代码使用了一个MyEvent类继承了events类,使MyEvent类的实例有了注册事件监听器的能力。然后调用了on()函数,注册了两个监听器。on()函数可以接收两个参数,第一个参数是事件名称,第二个参数是一个函数,为触发事件时执行的方法,函数的参数为触发事件时要传给监听器的参数,可以没有或有若干个。我注册了两个监听器,其中第二个监听器的第二个函数参数是采用ES6的箭头的写法。两者的区别是箭头函数没有this,而普通函数的this关键字指向监听器所绑定类的实例,在上面的代码里也就是myevent

  添加好监听器后,用emit()触发事件,后面的参数就是添加监听器时,函数内传递的参数。

  在node环境下运行上面的代码,就会输出:

1
2
event1
event2

  上面的方法其实继承的是events模块的EventEmitter类,所以我们直接用如下方法也可以。

1
2
3
4
5
6
7
const EventEmitter = require('events').EventEmitter

const myevent = new EventEmitter()
myevent.on('event', () => {
console.log('event') // event
})
myevent.emit('event')

once()

  除了用on()函数添加监听器,还可以用once()添加仅可以被触发一次的事件。

1
2
3
4
5
6
7
8
9
10
11
const events = require('events')

class MyEvent extends events { }
const myevent = new MyEvent()
myevent.once('event', () => {
console.log('event')
})

myevent.emit('event')
// 用once()添加的触发器只会被触发一次,下面的语句不会被执行。
myevent.emit('event')

setMaxListeners(n)

  默认情况下,如果为特定事件添加了超过 10 个监听器,则 EventEmitter 会打印一个警告。 这有助于发现内存泄露。使用setMaxlisteners()方法,可以调整这个限制。参数为一个数字,即次数,参数为0表示不限次数。

1
2
3
4
5
6
7
8
9
10
11
12
13
const events = require('events')

class MyEvent extends events { }
const myevent = new MyEvent()
myevent.setMaxListeners(11) // 修改事件监听器的数量为11
// 给event事件添加11个监听器
for (let i = 0; i <= 10; i++) {
myevent.on('event', () => {
console.log(`event${i + 1}`)
})
}

myevent.emit('event')

  上面的代码使用setMaxListeners()方法设置了myevent可以添加11个监听器(超过控制台会打印警告)。

removeListener()

  如果需要删除某个事件监听器的回调的话,可以使用removeListener()方法来操作。该方法接收两个参数,第一个参数为事件名称,第二个参数为事件的回调名称。(这里说的回调其实就是当前监听事件的执行函数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const events = require('events')

class MyEvent extends events { }
const myevent = new MyEvent()

function callback1() {
console.log('callback1')
}
function callback2() {
console.log('callback2')
}

myevent.on('event', callback1)
myevent.on('event', callback2)

// 删除callback1回调
myevent.removeListener('event', callback1)

// 触发事件
myevent.emit('event')

  执行上面的代码后,只有callback2被触发执行了。

removeAllListeners()

  如果我们要删除所有的监听事件,或者删除某个监听事件下所有的执行函数,可以用removeAllListeners()方法。这个方法接收一个可选参数,为事件名称。传入事件名称将删除该事件名称下的所有执行函数。不传入参数将删除所有的监听事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const events = require('events')

class MyEvent extends events { }
const myevent = new MyEvent()

function callback1() {
console.log('callback1')
}
function callback2() {
console.log('callback2')
}

// 这里添加了两个监听器
myevent.on('event1', callback1)
myevent.on('event2', callback2)

myevent.removeAllListeners('event1') // 删除event1监听事件
// myevent.removeAllListeners() // 如果执行这一句,event1和event2都将被删除

// 触发事件
myevent.emit('event1')
myevent.emit('event2')
0%