Node.js之EventEmiter
参考:
Node.js主要API使用异步事件驱动模型,异步I/O操作完成时,或者某些类型对象(触发器)会周期性地,触发一个命名事件到事件队列,用来调用函数对象(监听器)。
比如net.Server对象在每次有新连接时触发一个事件,fs.readStream对象在文件打开时触发一个事件。
所有这些能产生事件的对象都是events.EventEmitter的实例。
所有这些对象开放接口:
1. 注册事件名&监听器
on()注册一个事件(名)和一个监听器,添加到监听器数组末尾,addListener()是on()的别名。emit(), 按顺序执行每个监听器。
eventEmitter.on() // 绑定事件名&监听器
demo source code:
var events = require('events'); var eventEmitter = new events.EventEmitter; eventEmitter.on('start', function() { console.log('eventEmitter starts'); }); eventEmitter.emit('start');
运行结果(打印):
eventEmitter starts
2. 给监听器listener传入参数与this
emit方法允许给监听器传入任意参数,并且标准this会被设置为监听器所附加的EventEmitter。
demo:
var events = require('events'); var eventEmitter = new events.EventEmitter; eventEmitter.on('start', function(a,b) { console.log('eventEmitter starts'); console.log(a,b,this); }); eventEmitter.emit('start','a','b');
运行结果(打印):
eventEmitter starts a b { domain: null, _events: { start: [Function] }, _maxListeners: 10 }
3. 最多只触发一次的监听器
on注册的监听器可以触发多次,once注册的最多触发一次。
demo
var events = require('events'); var eventEmitter = new events.EventEmitter; //用on注册事件,绑定监听器 eventEmitter.on('start', function() { console.log('eventEmitter starts'); }); eventEmitter.emit('start'); eventEmitter.emit('start'); //用once注册事件,绑定监听器 eventEmitter.once('do', function() { console.log('eventEmitter do'); }); eventEmitter.emit('do'); eventEmitter.emit('do');
运行结果输出:
eventEmitter starts eventEmitter starts eventEmitter do
4. 错误事件
EventEmitter实例发生错误时,会触发名为‘error’的特殊事件。
为防止node.js程序崩溃,建议始终为'error'事件注册监听器。
var events = require('events'); var eventEmitter = new events.EventEmitter; //用on注册事件,绑定监听器 eventEmitter.on('error', function(err) { console.log('eventEmitter err occurs'); }); eventEmitter.emit('error', new Error('programme exception'));
运行输出结果:
eventEmitter err occurs
5. 添加监听器/移除监听器事件
当新增监听器时,所有EventEmitter会触发'newListener'事件;当移除监听器时,会触发'removeListener'事件。
demo
var events = require('events'); var eventEmitter = new events.EventEmitter; //用once注册事件,只会执行一次 eventEmitter.once('newListener', function(event, listener) { if(event=='start') { eventEmitter.on('start',function(){ console.log('start 2'); }); console.log('start'); } }); eventEmitter.on('start',function(){ console.log('eventEmitter start'); }); eventEmitter.emit('start');
运行输出:
start start 2 eventEmitter start
可以看到,触发‘start’事件,会同时触发'newListener'事件,并且on注册事件不会等待,而是直接执行后面的语句。
newListener&removeListener事件触发源 | ||
事件名 | 触发源 | 备注 |
newListener |
addListener() | on()别名 |
on() | ||
once() | 只执行一次便自行注销 | |
removeListener | removeListener() | |
removeAllListeners() | ||
off() |
removeListener()别名,v10.0.0添加 |
6. 最大监听器数量
获取最大监听器数量getMaxListeners(),v1.0.0 API才有用,老版本nodejs可能会有编译错误。超出最大数量限制时,可以调用setMaxListeners()重新设置更大值。