Node.js EventEmitter
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。Node.js 里面的许多对象都会分发事件,而这所有这些产生事件的对象都是 events.EventEmitter 的实例.events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装.了解EventEmitter对象可以帮助理解 node是怎么运作的,也可以自己写事件监听和触发.
样例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| const events = require('events'); const eventEmitter = new events.EventEmitter();
const listener1 = function listener1() { console.log('监听器 listener1 执行。'); };
const listener2 = function listener2(args) { console.log('监听器 listener2 执行。args=',args); };
eventEmitter.addListener('connection', listener1);
eventEmitter.on('connection', listener2);
const eventListeners = eventEmitter.listenerCount('connection'); console.log(eventListeners + ' 个监听器监听连接事件。');
eventEmitter.emit('connection');
eventEmitter.removeListener('connection', listener1); console.log('listener1 不再受监听。');
eventEmitter.emit('connection', 123);
eventListeners = eventEmitter.listenerCount('connection'); console.log(eventListeners + ' 个监听器监听连接事件。');
console.log('程序执行完毕。');
|
运行结果:
1 2 3 4 5 6 7 8 9
| $ node main.js 2 个监听器监听连接事件。
监听器 listener1 执行。 监听器 listener2 执行。args= listener1 不再受监听。 监听器 listener2 执行。args=123 1 个监听器监听连接事件。 程序执行完毕。
|
error 事件
EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。
当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。
我们一般要为会触发 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。例如catch (err){}
继承 EventEmitter
大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。
为什么要这样做呢?原因有两点:
具有某个实体功能的对象实现事件符合语义, 事件的监听和发生应该是一个对象的方法。
JavaScript 的对象机制是基于原型的,支持 部分多重继承,继承 EventEmitter 不会打乱对象原有的继承关系。
详细 API 文档