Event Emitter

在写FastAPI(暂定)的时候,看到了阿里团队的EventEmitter文章。

发现原来自己写的_notify,notifyAll方法都是没有必要的啊...自己又重新造了一套轮子。


// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

EventEmitter 对象如果在实例化时发生错误,会触发 error 事件。当添加新的监听器时,newListener 事件会触发,当监听器被移除时,removeListener 事件被触发。 下面我们用一个简单的例子说明 EventEmitter 的用法:

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
    console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
    event.emit('some_event'); 
}, 1000); 

虽然这种事件好,但是个人认为,这种东西会导致一个很严重的问题——万一event名字打错了,就彻底凉了。

虽然可以通过重新定义一些mapped function去输出事件


const postSomeEvent = (data)  => event.emit('some_event', data)

但是,多写这个Function还是相当麻烦的。

如果能够提供一种方便的mapping方法,就可以免去这种重复的定义了。

Typescript中Vuex其实提供了一部分解决方案,但是并不完美。如果Module分离,那么就无法获取到具体的类型信息,自然就无法推断了。

在前端业务开发中,我们经常也会用到 EventEmitter 库来进行消息传递。比如页面上有两块区域,一块用 React 框架渲染,一块用 D3 渲染的,当两块区域需要数据同步时,就可以使用消息机制进行通讯,保证页面数据整体一致。 如果你的业务中有不同生命周期的组件,建议采用消息机制进行管理,不仅消除了耦合,逻辑关系部分的代码也集中到了一个文件中,内聚性得到了提升。 使用消息机制的一个附属产物就是中间件,我们可以为消息定制各种中间件,在中间中完成一些通用逻辑,让业务代码更精炼。