1. 事件机制与EventEmitter
大部分的Node.js核心API被实现为异步事件驱动架构,这些对象(“发射器”)会周期性的发射事件名,并会触发监听函数(“监听器”)的调用。
Node.js中许多对象都可以发送事件。如:net.Server对象会在每次收到新连接时发送'request'事件;fs.ReadStream对象会在打开文件时发送'open'事件;stream.Readable对象会在每次读取数据时发送'data'事件。
所有这些可以发送事件的对象,都是一个EventEmitter类实例。它们会暴露一个工eventEmitter.on()函数,在指定事件发送时调用监听函数。
当EventEmitter对象发送事件时,其上绑定函数会被同步调用。但是,监听函数所有的返回值都会被忽略。
通过继承EventEmitter类后,其实例就是一个事件发射器:
上例中通过util.inherits()方法实现了Node.js式继承。同样,也可以使用ES6 Class:
向监听器传递参数
eventEmitter.emit()发射事件时,可以向监听函数传递参数。其第一个参数为事件名,其后参数为要传递给事件监听器的参数:
多次与单次监听
通过eventEmitter.on()注册的事件监听器会在每次触发指定时调用。
而通过eventEmitter.once()方法注册的事件监听器只会被调用一次:
2. Class: EventEmitter
EventEmitter类在events模块中定义并导出的类,该类的实例就是一个事件发射器,Node.js中所有具有事件发射功能的对象都是该类的一个实例。可以像下面这样获取该类:
const EventEmitter = require('events');
所有EventEmitter类实例中都有'newListener'和'removeListener'两个事件,分别会在添加新的事件临听器和移除事件临听器时触发。
EventEmitter.defaultMaxListeners设置监听器数量
默认情况下,每个事件可以添加10个事件监听器。可以通过emitter.setMaxListeners(n) 方法修改每个实例的监听器数量。如果需要全局修改可添加事件监听器数量,可以通过类属性
EventEmitter.defaultMaxListeners来设置。
EventEmitter实例中的常用方法有:
emitter.addListener(eventName, listener) - 添加事件监听器,emitter.on()的别名方法
emitter.getMaxListeners() - 最大可添加的监听器数量
emitter.listenerCount(eventName) - 某事件的监听器数量
emitter.listeners(eventName) - 返回事件所有的监听函数
emitter.on(eventName, listener) - 添加事件监听器
emitter.once(eventName, listener) - 添加仅使用一次的事件监听器
emitter.removeAllListeners([eventName]) - 移除所有事件监听器emitter.removeListener(eventName, listener) - 移除指定事件的监听器
emitter.setMaxListeners(n) - 设置最大可添加监听器,此设置优先级高于全局设置
来自:http://itbilu.com
交流群:564850876