删除监听事件

前面已经学习了如何添加及触发监听事件,如果添加的监听事件不需要了,可以将它删除。删除监听事件的方法如下。

  • removeListener(eventName,listener):删除指定名称的监听事件。

  • removeAllListeners([eventName]):删除全部监听事件。

下面通过一个实例来演示如何使用 Node.js 中删除监听事件的方法。

【例5.6】删除指定的监听事件。(实例位置:资源包\源码\05\06)

该实例在例5.4的基础上进行修改,将要添加到监听事件的回调函数单独定义,并添加到 event 监听事件并触发;在触发监听事件后,使用 removeListener 方法删除该监听事件,并通过输出删除前后的监听事件名称进行对比。代码如下:

//引入events模块
var events = require('events');
//生成EventEmitter对象
var custom = new events.EventEmitter();
function listener() {
     console.log('触发监听事件!');
}
//添加监听事件event
custom.on('event', listener);
//主动触发监听事件event
custom.emit('event');
console.log(custom.eventNames());            //输出删除前的监听事件名称
custom.removeListener('event',listener) ;    //删除event事件
console.log(custom.eventNames());            //输出删除后的监听事件名称

EventEmitter 中还提供了 off(eventName, listener) 方法,该方法实际上相当于 removeListener 方法的别名,也可以删除指定名称的监听事件,其使用方法与 removeListener 完全一样。

运行程序,效果如图5.7所示。

image 2024 04 08 23 51 49 713
Figure 1. 图5.7 删除指定的监听事件

在使用 removeListener 方法删除监听事件时,如果同一个事件监听器被多次添加到指定 eventName 的监听器数组中,则必须多次调用 removeListener 方法才能删除所有事件。例如,将例5.6的代码修改如下:

//引入events模块
var events = require('events');
//生成EventEmitter对象
var custom = new events.EventEmitter();
function listener() {
     console.log('触发监听事件!');
}
//添加监听事件event
custom.on('event', listener);
/*多次添加同一个事件*/
custom.on('event', listener);
custom.on('event', listener);
custom.on('event', listener);
//主动触发监听事件event
custom.emit('event');
console.log(custom.eventNames());         //输出删除前的监听事件名称
custom.removeListener('event',listener);  //删除event事件
console.log(custom.eventNames());         //输出删除后的监听事件名称

上面代码中为 event 事件添加了 4 次 listener 回调函数,但只使用 removeListener 删除了一次 event 事件,运行结果如图5.8所示。

image 2024 04 08 23 53 15 001
Figure 2. 图5.8 使用removeListener方法删除多次添加的事件时的效果

观察图5.8可以看出,删除前后,event 事件都存在,说明使用 removeListener 并没有完全删除多次添加的 event 事件。这时,如果想要完全删除 event 事件,可以使用 removeListener 方法删除 4 次,也可以直接使用 removeAllListeners 删除所有的监听事件,代码如下:

custom.removeAllListeners('event');  //删除所有event事件