手写EventEmitter

一、概念#
1.EventEmitter#
EventEmitter (事件派发器)是 Node.js 的核心模块 events 中的类,用于对 Node.js 中的事件进行统一管理,用 events 特定的 API 对事件进行添加、触发和移除等等,EventEmitter 的核心就是事件触发与事件监听器功能的封装。
简而言之,EventEmitter就是一个典型的发布订阅模式,实现了事件调度中心。
javascript中常被提及的「发布订阅模式」,在面试的过程中,面试官往往会让你通过手写EventEmitter的方式来观察你对于这个模式的理解。
2.发布订阅模式#
发布订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到状态改变的通知。
发布订阅模式中,包含发布者,事件调度中心,订阅者三个角色。发布者和订阅者是松散耦合的,互不关心对方是否存在,他们关注的是事件本身。发布者借用事件调度中心提供的publish方法发布事件,而订阅者则通过subscribe进行订阅。

特点
- 发布订阅模式中,对于发布者
Publisher和订阅者Subscriber没有特殊的约束,他们好似是匿名活动,借助事件调度中心提供的接口发布和订阅事件,互不了解对方是谁。 - 松散耦合,灵活度高,常用作事件总线。
- 易理解,可类比于
DOM事件中的dispatchEvent和addEventListener。
缺点
- 当事件类型越来越多时,难以维护,需要考虑事件命名的规范,也要防范数据流混乱。
二、实现#
1.EventEmitter#
使用:
补充:
findIndex() 方法返回传入一个测试条件(函数)符合条件的数组第一个元素位置。
findIndex() 方法为数组中的每个元素都调用一次函数执行:
- 当数组中的元素在测试条件时返回
true时,findIndex()返回符合条件的元素的索引位置,之后的值不会再调用执行函数。 - 如果没有符合条件的元素返回 -1
注意:
findIndex()对于空数组,函数是不会执行的。findIndex()并没有改变数组的原始值。
2.发布订阅模式#
三、总结#
在EventEmitter (事件派发器)类中,每一个监听者(回调函数)相当于发布订阅模式中的订阅者Subscriber,而每一次发布事件相当于发布订阅模式中发布者Publisher的发布行为。