在Node.js(以下简称node)中,有一个events模块,中文名称是“事件触发器”。node的一大特点就是事件驱动。在node里,很多行为都会触发相应的事件,而所有能触发事件的对象都是events模块类的实例,它们都有添加事件的能力。
on()
先看代码:
1 | const events = require('events') |
上面的代码使用了一个MyEvent
类继承了events
类,使MyEvent
类的实例有了注册事件监听器的能力。然后调用了on()
函数,注册了两个监听器。on()
函数可以接收两个参数,第一个参数是事件名称,第二个参数是一个函数,为触发事件时执行的方法,函数的参数为触发事件时要传给监听器的参数,可以没有或有若干个。我注册了两个监听器,其中第二个监听器的第二个函数参数是采用ES6的箭头的写法。两者的区别是箭头函数没有this
,而普通函数的this
关键字指向监听器所绑定类的实例,在上面的代码里也就是myevent
。
添加好监听器后,用emit()
触发事件,后面的参数就是添加监听器时,函数内传递的参数。
在node环境下运行上面的代码,就会输出:
1 | event1 |
上面的方法其实继承的是events
模块的EventEmitter
类,所以我们直接用如下方法也可以。
1 | const EventEmitter = require('events').EventEmitter |
once()
除了用on()
函数添加监听器,还可以用once()
添加仅可以被触发一次的事件。
1 | const events = require('events') |
setMaxListeners(n)
默认情况下,如果为特定事件添加了超过 10
个监听器,则 EventEmitter
会打印一个警告。 这有助于发现内存泄露。使用setMaxlisteners()
方法,可以调整这个限制。参数为一个数字,即次数,参数为0表示不限次数。
1 | const events = require('events') |
上面的代码使用setMaxListeners()
方法设置了myevent
可以添加11个监听器(超过控制台会打印警告)。
removeListener()
如果需要删除某个事件监听器的回调的话,可以使用removeListener()
方法来操作。该方法接收两个参数,第一个参数为事件名称,第二个参数为事件的回调名称。(这里说的回调其实就是当前监听事件的执行函数)
1 | const events = require('events') |
执行上面的代码后,只有callback2被触发执行了。
removeAllListeners()
如果我们要删除所有的监听事件,或者删除某个监听事件下所有的执行函数,可以用removeAllListeners()
方法。这个方法接收一个可选参数,为事件名称。传入事件名称将删除该事件名称下的所有执行函数。不传入参数将删除所有的监听事件。
1 | const events = require('events') |