EventEmitter类
events模块提供一个对象:events.EventEmitter,核心是事件触发和事件监听的封装。
大多数时候不会直接使用EventEmitter,而是在对象中继承它(new一个出来)。
方法:
on:
为指定事件注册一个监听器,接收一个字符串event和一个回调函数。
emit:
触发事件。返回值为布尔值。
once:
为指定事件注册一个单次监听器,最多只会触发一次,触发后立刻解除该监听器。
addListener:
为指定事件添加一个监听器到监听器数组的尾部。
removeListener:
移出指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。接收两个参数,一个是事件名称,第二个是回调函数名称。
removeAllListeners:
移除所有事件的监听器,如果指定事件,则移除指定事件的所有监听器。
listeners:
返回指定事件的监听器数组。
示例:
//test.js文件 var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); var listener1 = function listener1() { console.log('监听器1执行'); }; var listener2 = function listener2() { console.log('监听器2执行'); }; emitter.on('someEvent', listener1); emitter.on('someEvent', listener2); var eventListeners = EventEmitter.listenerCount(emitter, 'someEvent'); console.log(eventListeners + '个监听器'); //2个监听器 emitter.emit('someEvent'); //移除第一个监听器listenter1 emitter.removeListener('someEvent', listener1); var eventListeners = EventEmitter.listenerCount(emitter, 'someEvent'); console.log(eventListeners + '个监听器'); //1个监听器 console.log('程序执行完毕');
执行:
$ node test.js
2个监听器
监听器1执行
监听器2执行
1个监听器
程序执行完毕
setMaxListeners:
默认情况下,EventEmitters超过10个监听器就会输出警告信息。setMaxListeners函数用于提高监听器的默认限制的数量。
示例:
//test.js文件 var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); emitter.on('someEvent', function () { console.log('监听器1执行'); }); emitter.on('someEvent', function () { console.log('监听器2执行'); }); emitter.on('someEvent', function () { console.log('监听器3执行'); }); emitter.on('someEvent', function () { console.log('监听器4执行'); }); emitter.on('someEvent', function () { console.log('监听器5执行'); }); emitter.on('someEvent', function () { console.log('监听器6执行'); }); emitter.on('someEvent', function () { console.log('监听器7执行'); }); emitter.on('someEvent', function () { console.log('监听器8执行'); }); emitter.on('someEvent', function () { console.log('监听器9执行'); }); emitter.on('someEvent', function () { console.log('监听器10执行'); }); emitter.on('someEvent', function () { console.log('监听器11执行'); }); emitter.emit('someEvent');
命令行执行:
$ node test.js 监听器1执行 监听器2执行 监听器3执行 监听器4执行 监听器5执行 监听器6执行 监听器7执行 监听器8执行 监听器9执行 监听器10执行 监听器11执行 (node:10112) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 someEvent listeners added. Use emitter.setMaxListeners() to increase limit
当绑定的监听器超过10个时,虽然程序顺利执行,但是抛出了警告。如下所示,就不会发出警告了。要添加在监听器绑定的前面。
//test.js文件 var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); emitter.setMaxListeners(11); //提高监听器的默认限制数量 emitter.on('someEvent', function () { console.log('监听器1执行'); }); emitter.on('someEvent', function () { console.log('监听器2执行'); }); emitter.on('someEvent', function () { console.log('监听器3执行'); }); emitter.on('someEvent', function () { console.log('监听器4执行'); }); emitter.on('someEvent', function () { console.log('监听器5执行'); }); emitter.on('someEvent', function () { console.log('监听器6执行'); }); emitter.on('someEvent', function () { console.log('监听器7执行'); }); emitter.on('someEvent', function () { console.log('监听器8执行'); }); emitter.on('someEvent', function () { console.log('监听器9执行'); }); emitter.on('someEvent', function () { console.log('监听器10执行'); }); emitter.on('someEvent', function () { console.log('监听器11执行'); }); emitter.emit('someEvent');
监听事件的最大额度并不是为所有事件分配的,例如下面代码,不会发出监听器数量警告
var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); emitter.on('someEvent', function () { console.log('监听器1执行'); }); emitter.on('someEvent', function () { console.log('监听器2执行'); }); emitter.on('someEvent', function () { console.log('监听器3执行'); }); emitter.on('someEvent', function () { console.log('监听器4执行'); }); emitter.on('someEvent', function () { console.log('监听器5执行'); }); emitter.on('someEvent', function () { console.log('监听器6执行'); }); emitter.on('someEvent2', function () { console.log('监听器7执行'); }); emitter.on('someEvent2', function () { console.log('监听器8执行'); }); emitter.on('someEvent2', function () { console.log('监听器9执行'); }); emitter.on('someEvent2', function () { console.log('监听器10执行'); }); emitter.on('someEvent2', function () { console.log('监听器11执行'); }); emitter.emit('someEvent'); emitter.emit('someEvent2');