Node.js的异步I/O操作使用事件机制实现,Node 中里很多对象都是events.EventEmitter的实例,如:net.Server在建立连接时和连接断开时都会分发事件,fs模块在打开和读取文件时也会分发对应的事件。Node.js通过events模块实现事件机制,该模块中有唯一的类EventEmitter。
1. 类:events.EventEmitter
可以使用以下方法获取对EventEmitter类的引用:
// v 0.10.x 以前的版本
var EventEmitter = require('events').EventEmitter;
// v 0.10.x 以后的版本
var EventEmitter = require('events');
EventEmitter实例发生错误时,会抛出'error'事件,如果这个事件没有被监听,Node会在控制台打一个堆栈信息并退出程序。
通过引用并继承EventEmitter类,就可以实现一个事件发射器。当事件发射器添加新的监听器时,会触发'newListener'事件,当移除事件监听时,会触发'removeListener'事件。
示例,继承EventEmitter类:
'use strict';
const util = require('util');
const EventEmitter = require('events');
function MyEventEmitter() {
// 初始化`EventEmitter`this实例上必要的属性
EventEmitter.call(this);
}
// 继承`EventEmitter`原型链上的方法
util.inherits(MyEventEmitter, EventEmitter);
2. EventEmitter类中的事件及属性
2.1 事件:'newListener'
添加listener的时候会触发这个事件,这个事件被触发的时,listener可能还没添加到listener监听器数组中。添加任何新的事件监听器后,'newListener'事件的回调函数都会在该监听器被添加前回调。
2.2 事件:'removeListener'
删除listener的时候会触发这个事件。当这个事件触发的时候,listener可能还还没从listener数组移除,该事件被移除前,会调用该事件的回调函数。
2.3 属性:defaultMaxListeners
通过实例方法emitter.setMaxListeners(n)可以设置的每个实例的最大listener数,但如果实例未设置时,将使用EventEmitter.defaultMaxListeners。
3. EventEmitter类实例方法
3.1 添加监听器:emitter.addListener()
emitter.addListener(event, listener)
emitter.on(event, listener)的别名方法。
3.2 发送事件:emitter.emit()
emitter.emit(event[, arg1][, arg2][, ...])
event:String,事件名[, arg1][, arg2][, ...]:发送给监听器的参数返回值:Boolean
提供的参数按顺序执行指定事件的listener,如果事件存在listener则返回true,否则返回false。
3.3 最大可添加监听器数:emitter.getMaxListeners()
emitter.getMaxListeners()
返回当前实例最大可添加监听器数,其数量为emitter.getMaxListeners(n)方法设置的数量或EventEmitter.defaultMaxListeners。
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', function () {
// 一些操作
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
3.4 返回事件的监听器数:emitter.listenerCount()
emitter.listenerCount(type)
type:String,事件类型返回值:Number
返回type类型事件的监听器数。
3.5 返回事件的监听器数:emitter.listeners()
emitter.listeners(event)
event:String,事件名返回值:Array
返回event事件的listener数组。
server.on('connection', function (stream) {
console.log('一些连接!');
});
console.log(util.inspect(server.listeners('connection'))); // [ [Function] ]
3.6 添加事件监听器:emitter.on()
emitter.on(event, listener)
event:String,事件名listener:Function,给事件添加的监听器函数返回值:emitter
添加一个监听器到指定事件event 的监听数组的末尾。触发器不会检查是否已经添加过这个listener,多次调用相同的event 和 listener 将会导致 listener 添加多次。
server.on('connection', function (stream) {
console.log('一些连接!');
});
3.7 添加一次性事件监听器:emitter.once()
emitter.once(event, listener)
event:String,事件名listener:Function,给事件添加的监听器函数返回值:emitter
添加一个一次性的监听器到指定事件event的监听数组的末尾,该监听器将在下次收到事件时触发,并在触发后被删除。
server.once('connection', function (stream) {
console.log('Ah, 这是个一次性的事件');
});
3.8 移除所有监听器:emitter.removeAllListeners()
emitter.removeAllListeners([event])
event:String,可选参数,事件名返回值:emitter
移除所有事件监听器,或移除指定事件event的监听器。
server.once('connection', function (stream) {
console.log('Ah, 这是个一次性的事件');
});
3.9 移除指定事件的指定监听器:emitter.removeListener()
emitter.removeListener(event, listener)
event:String,事件名listener:Function,要移除的事件监听函数返回值:emitter
从一个事件event的listener数组中删除一个listener。
var callback = function(stream) {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
3.10 设置最大可添加监听器数:emitter.setMaxListeners()
emitter.setMaxListeners(n)
n:Number,数量返回值:emitter
默认情况下,EventEmitter可添加监听器数为10,当超过10个时会发出警告,以此防止内存泄露。如果你所需要的添加的监听器数超过10个,可以通过emitter.setMaxListeners(n)方法进行修改。当设置为Infinity或0时,表示没有没有数量限制。
