本节介绍Node.js事件的常用操作。
默认情况下,每个事件可以注册最多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。
可以通过emitter.eventNames()方法来返回已注册监听器的事件名数组。数组中的值可以为字符串或Symbol。以下是示例。
上述程序在控制台输出的内容如下:
本节例子可以在“events-demo/event-names.js”文件中找到。
可以通过emitter.listeners(eventName)方法来返回名为eventName的事件的监听器数组的副本。以下是示例。
上述程序在控制台输出的内容如下。
本节例子可以在“events-demo/event-listeners.js”文件中找到。
通过emitter.on(eventName, listener)方法,监听器listener会被添加到监听器数组的末尾。可以通过emitter.prependListener()方法,将事件监听器添加到监听器数组的开头。以下是示例。
默认情况下,事件监听器会按照添加的顺序依次调用。由于prependListener方法让监听器提前到了数组的开头,因此该监听器会被优先执行。所以控制台输出的内容为:
注意,注册监听器时,不会检查监听器是否已被添加过。因此,多次调用并传入相同的eventName与listener会导致listener会被添加多次,这是合法的。
本节例子可以在“events-demo/prepend-listener.js”文件中找到。
通过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”文件中找到。