node系列之events(事件)

地址

传送门

说明

万物基于事件。这句话虽然有点夸张,但是在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的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容