购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.4 事件的操作

本节介绍Node.js事件的常用操作。

实战5.4.1实战:设置最大监听器

默认情况下,每个事件可以注册最多10个监听器。可以使用emitter.setMaxListeners(n)方法改变单个EventEmitter实例的限制,也可以使用EventEmitter.defaultMaxListeners属性来改变所有EventEmitter实例的默认值。

需要注意的是,设置EventEmitter.defaultMaxListeners要谨慎,因为这个设置会影响所有EventEmitter实例,包括之前创建的。因而,推荐优先使用emitter.setMaxListeners(n)而不是EventEmitter.defaultMaxListeners。

虽然可以设置最大监听器,但这个限制不是硬性的。EventEmitter实例可以添加超过限制的监听器,只是会向stderr输出跟踪警告,表明检测到可能的内存泄漏。对于单个EventEmitter实例,可以使用emitter.getMaxListeners()和emitter.setMaxListeners()暂时地消除警告。

如果想显示此类警告的堆栈跟踪信息,可以使用“-trace-warnings”命令行参数。

触发的警告可以通过process.on(warning)进行检查,并具有附加的emitter、type和count属性,分别指向事件触发器实例、事件名称,以及附加的监听器数量。其name属性设置为MaxListenersExceededWarning。

实战5.4.2实战:获取已注册的事件的名称

可以通过emitter.eventNames()方法来返回已注册监听器的事件名数组。数组中的值可以为字符串或Symbol。以下是示例。

上述程序在控制台输出的内容如下:

本节例子可以在“events-demo/event-names.js”文件中找到。

实战5.4.3实战:获取监听器数组的副本

可以通过emitter.listeners(eventName)方法来返回名为eventName的事件的监听器数组的副本。以下是示例。

上述程序在控制台输出的内容如下。

本节例子可以在“events-demo/event-listeners.js”文件中找到。

实战5.4.4实战:将事件监听器添加到监听器数组的开头

通过emitter.on(eventName, listener)方法,监听器listener会被添加到监听器数组的末尾。可以通过emitter.prependListener()方法,将事件监听器添加到监听器数组的开头。以下是示例。

默认情况下,事件监听器会按照添加的顺序依次调用。由于prependListener方法让监听器提前到了数组的开头,因此该监听器会被优先执行。所以控制台输出的内容为:

注意,注册监听器时,不会检查监听器是否已被添加过。因此,多次调用并传入相同的eventName与listener会导致listener会被添加多次,这是合法的。

本节例子可以在“events-demo/prepend-listener.js”文件中找到。

实战5.4.5实战:移除监听器

通过emitter.removeListener(eventName, listener)方法,从名为eventName的事件的监听器数组中移除指定的listener。以下是示例。

在上述示例中,通过listenerCount()方法来获取监听器的个数。通过removeListener()前后的监听器个数的对比,可以看到removeListener()方法已经移除掉了foo监听器。

以下是控制台的输出内容。

removeListener()最多只会从监听器数组中移除一个监听器。如果监听器被多次添加到指定eventName的监听器数组中,则必须多次调用removeListener()才能移除所有实例。

如果想要快捷地删除某个eventName所有的监听器,则可以使用emitter.removeAllListeners([event Name])方法。

在上述示例中,通过listenerCount()方法来获取监听器的个数。通过removeListener()前后的监听器个数的对比,可以看到removeListener()方法已经移除掉了foo监听器。

以下是控制台的输出内容。

本节例子可以在“events-demo/remove-listener.js”文件中找到。 Rw1++HfYGMZvfIhpRxcaTwDCrJHBvDu7EM5VDeGeOvikNuxVse+aIfNrsaLtnzAt

点击中间区域
呼出菜单
上一章
目录
下一章
×