当前位置: 首页 > news >正文

js 定义事件中心EventEmitter

在JavaScript中,EventEmitter 是一个常用于事件驱动编程的类,它允许对象(或称为“发射器”)发出命名事件,并让其他对象(或称为“监听器”)监听并响应这些事件。Node.js 的 events 模块提供了一个内置的 EventEmitter 类,但你也可以自己实现一个简单的版本。

下面是一个基本的 EventEmitter 实现示例:

class EventEmitter {constructor() {this.events = {};}// 注册事件监听器on(eventName, listener) {if (!this.events[eventName]) {this.events[eventName] = [];}this.events[eventName].push(listener);}// 一次性监听器,触发后立即移除once(eventName, listener) {const onceWrapper = (...args) => {this.off(eventName, onceWrapper);listener(...args);};this.on(eventName, onceWrapper);}// 移除事件监听器off(eventName, listener) {if (!this.events[eventName]) return;this.events[eventName] = this.events[eventName].filter(l => l !== listener);}// 触发事件emit(eventName, ...args) {if (!this.events[eventName]) return;this.events[eventName].forEach(listener => listener(...args));}// 获取事件监听器的数量listenerCount(eventName) {return this.events[eventName] ? this.events[eventName].length : 0;}
}// 使用示例
const myEmitter = new EventEmitter();myEmitter.on('event', () => {console.log('an event occurred!');
});myEmitter.emit('event'); // 输出: an event occurred!// 使用一次性监听器
myEmitter.once('event', () => {console.log('this will be logged only once');
});myEmitter.emit('event'); // 输出: this will be logged only once
myEmitter.emit('event'); // 不会再次输出上面的日志

这个 EventEmitter 类实现了最基本的功能:注册监听器(on)、一次性监听器(once)、移除监听器(off)、触发事件(emit)以及获取监听器数量(listenerCount)。

请注意,这个实现是简化的,并没有处理一些边缘情况,比如在移除监听器时如果监听器没有被注册过,或者在触发事件时如果监听器抛出异常等。在实际应用中,你可能需要更健壮的实现,这时可以考虑使用 Node.js 内置的 events 模块中的 EventEmitter 类。


http://www.mrgr.cn/news/43315.html

相关文章:

  • 【算法笔记】滑动窗口算法原理深度剖析
  • Python中的仅限位置参数与仅限关键字参数
  • memset二维数组
  • 二分查找寻找左边界-2187. 完成旅途的最少时间
  • C(十三)for、while、do - while循环的抉择 --- 打怪闯关情景
  • Sentinel学习
  • Python 中的可调用对象
  • WordPress修改固定链接后301的重定向方法
  • 【AIGC】ChatGPT提示词Prompt助力自媒体内容创作升级
  • OpenCV马赛克
  • 软件设计师——数据结构
  • Windows系统编程(三)进程与线程二
  • 如何在 PHP 中使用 array_unique 函数去重关联数组?
  • 玩具CPSC认证办理流程
  • 力扣10.5
  • MS-900认证:Microsoft 365 Certified: Fundamentals
  • 【FreeRTOS】移植教程与官方文档
  • Leecode刷题之路第十天之正则表达式匹配
  • 安卓AI女友项目之安卓AI虚拟数字人整合开发
  • 【深度学习】自动微分——Autodiff or Autograd?