说起Node中几个最重要的模块,那么events
模块一定在其中,在Node中很多很多的其他模块都是基于或者依赖于events
模块。
那么我们来了解一下什么是events
模块和events
模块的使用,和一些注意点
我们参看的Node v6.10.3文档, 对于EventEmitter的方法我们不解释,相对比较简单,官方也给出了较多的例子,完全可以参看官方的文档,这里就说明一些注意点
EventEmitter实例化
首先很多的教程里面会写以下的代码来实例化一个EventEmitter
1 | var events = require('events'); |
但是官方给出的例子却是
1 | const EventEmitter = require('events'); |
在REPL
中输出const EventEmitter = require('events');
中的EventEmitter
1 | EventEmitter |
同时在翻看源码之后看到
1 | module.exports = EventEmitter; |
所以,两种方式都是可以的,但是感觉按照官方的方式会更好。
error事件
当 EventEmitter 实例中发生错误时,会触发一个 ‘error’ 事件。 这在 Node.js 中是特殊情况。
如果 EventEmitter 没有为 ‘error’ 事件注册至少一个监听器,则当 ‘error’ 事件触发时,会抛出错误、打印堆栈跟踪、且退出 Node.js 进程。
1 | const myEmitter = new MyEmitter(); |
所以应该始终为 ‘error’ 事件注册监听器。1
2
3myEmitter.on('error', (err) => {
console.error('有错误');
});
另外提一句为了防止 Node.js 进程崩溃,可以在 process 对象的 uncaughtException
事件上注册监听器。
1 | const myEmitter = new MyEmitter(); |
this作用域
在ES6加入后,有了箭头函数,有时候会导致监听器的this
作用域的不同,这里需要稍微注意一下
1 | const myEmitter = new MyEmitter(); |
箭头函数版本1
2
3
4
5
6const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
console.log(a, b, this);
// 打印: a b {}
});
myEmitter.emit('event', 'a', 'b');
相信了解过箭头函数的原理的都应该可以理解。
on()
和 addListener()
的区别
没有区别
1 | EventEmitter.prototype.on = EventEmitter.prototype.addListener; |