地址
说明
万物基于事件。这句话虽然有点夸张,但是在nodejs的世界里,还是挺有道理的。很多的模块,都是继承于event。比如,http,file等,都有事件的影子。http监听一个请求事件,文件可以监听读取数据。
基本用法
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
监听事件: on
触发事件: emit
需要注意的是,监听事件需要放在触发事件之前,不然会导致异常,进程可能直接退出。当然,如果不想进程直接简单粗暴地退出,可以使用下面语句
process.on('uncaughtException', (err) => {
console.log('whoops! there was an error');
});
// 上面这堆东西也是需要尽可能得放在程序前面哦,不然会捕获不到错误事件的
newListener
事件
在任何的事件被添加(注册)之前,都会触发这个事件。
比如,在myEmitter.on('news')
之前,就会先触发了myEmitter.emit('newListener')
。
同理可得removeListener
事件查询注册的事件
myEmitter.on( 'foo', () => {})
myEmitter.on( 'bar', () => {})
myEmitter.eventNames();
// [ 'foo', 'bar']
某个事件的个数
myEmitter.listenerCount(eventName)
响应某个事件之前执行
myEmitter.prependListener(eventName,listener)
myEmitter.prependOnceListener(eventName,listener)
移除事件
单个事件:emitter.removeListener(eventName, listener)
全部事件:emitter.removeAllListeners([eventName])
需要注意的是,removeListener
不会影响当前的事件执行。比如,当有3个event
事件,触发这个event
事件的时候,会将这3个事件放到内部数组里面,不会受外界干扰。假如第一个listener移除了第2个listener,这3个事件依然会执行。到下一次再次出发这个事件的时候,只会执行第1和第3个事件。
小结
感觉这个event
模块,设计得还是挺不错的。比如每次调用完一个方法后,都返回当前实例,这样就可以使用链式调用了。
Returns a reference to the EventEmitter, so that calls can be chained.
很多的模块都是基于此,虽然用得不是很多,但在某种场合下,用得还是挺6的。