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.xdnf.cn/news/1555157.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

I/O多路转接

目录 一、select 1.1、select概念 1.2、select 函数原型 1.3、理解 select 执行过程 1.4、select就绪条件 1.4.1、读就绪 1.4.2、写就绪 1.4.3、异常就绪(了解) 1.5、select 基本工作流程 1.6、select服务器 1.6.1、Sock.hpp 1.6.2、selectS…

【复习】html最重要的表单和上传标签

文章目录 imgforminput img <img src"https://tse1-mm.cn.bing.net/th/id/OIP-C._XVJ53-pN6sDMXp8W19F4AAAAA?rs1&pidImgDetMain"alt"二次元"height"350px"width"200px"/>常用 没啥说的&#xff0c;一般操作css多一些 for…

CSP-J/S复赛算法 动态规划初步

文章目录 前言动态规划动态规划常见形式动态规划求最值的几个例子1. **背包问题**2. **最短路径问题**3. **最小硬币找零问题**4. **最长递增子序列** 总结 最优子结构举个简单的例子其他例子条件 DP的核心就是穷举具体解释 递归的算法时间复杂度dp数组的迭代解法通俗易懂的解释…

LabVIEW提高开发效率技巧----使用动态事件

在LabVIEW开发过程中&#xff0c;用户交互行为可能是多样且不可预知的。为应对这些变化&#xff0c;使用动态事件是一种有效的策略。本文将从多个角度详细介绍动态事件的概念及其在LabVIEW开发中的应用技巧&#xff0c;并结合实际案例&#xff0c;说明如何通过动态事件提高程序…

招联2025校招内推倒计时

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

8648 图的深度遍历

### 思路 1. **图的邻接表存储结构**&#xff1a;使用邻接表存储图的顶点和边信息。 2. **基本操作函数**&#xff1a;包括创建图、查找顶点、获取顶点值、获取第一个邻接顶点、获取下一个邻接顶点等。 3. **深度优先遍历&#xff08;DFS&#xff09;**&#xff1a;从某个顶点出…

车载项目:HIL测试、功能安全测试、CAN一致性测试、UDS测试、ECU测试、OTA测试、TBOX测试、导航测试、车控测试

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

今日指数项目个股描述功能实现

个股描述功能实现 1 个股描述功能实现说明 1&#xff09;原型示意 2&#xff09;接口说明 功能描述&#xff1a;个股主营业务查询接口 服务路径&#xff1a;/api/quot/stock/describe 服务方法&#xff1a;GET 请求参数&#xff1a;code #股票编码 响应参数&#xff1a; {…

java计算机毕设课设—坦克大战游戏

这是什么系统&#xff1f; 坦克大战游戏是一款以坦克为主题的射击游戏&#xff0c;旨在为玩家提供一个刺激、有趣的游戏体验。该游戏不仅拥有丰富的功能&#xff0c;还注重玩家的互动体验。此系统是使用Java语言实现坦克大战游戏程序&#xff0c;玩家通过连接访问进入游戏&…

C语言指针plus版练习

上期我们讲了进阶的指针&#xff0c;本期内容我们来强化一下上期学的内容 一、字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 1.1 分析题目 假设字符串为abcde&#xff0c;左旋一个以后就变成bcdea&#xff0c;就是把第一个字符移到一个新的变量里面&#…

一、走进新语言

走进新语言 介绍环境配置JDK配置Kotlin配置 开发工具代码基本结构程序注释 介绍 Kotlin是一种现代但已经成熟的编程语言&#xff0c;旨在让开发人员更快乐。它简洁、安全、可与Java和其他语言互操作&#xff0c;并提供了许多在多个平台之间重用代码的方法。它由JetBrains公司于…

8647 实现图的存储结构

### 思路 1. 读取输入的顶点个数n和边的条数m。 2. 初始化一个n*n的邻接矩阵&#xff0c;所有元素初始为0。 3. 读取每条边的信息&#xff0c;更新邻接矩阵对应位置为1。 4. 输出邻接矩阵。 ### 伪代码 1. 读取n和m。 2. 初始化n*n的邻接矩阵matrix&#xff0c;所有元素为0。 …

DatePicker 日期控件

效果&#xff1a; 要求&#xff1a;初始显示系统当前时间&#xff0c;点击日期控件后修改文本控件时间。 目录结构&#xff1a; activity_main.xml(布局文件)代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:and…

[C++]使用纯opencv部署yolov11-pose姿态估计onnx模型

【算法介绍】 使用纯OpenCV部署YOLOv11-Pose姿态估计ONNX模型是一项具有挑战性的任务&#xff0c;因为YOLOv11通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff0c;可以通过一些间接的方法来实现这一目标&#x…

Apollo9.0 Planning2.0决策规划算法代码详细解析 (5): OnLanePlanning::Init()

&#x1f31f; 面向自动驾驶规划算法工程师的专属指南 &#x1f31f; 欢迎来到《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏&#xff01;本专栏专为自动驾驶规划算法工程师量身打造&#xff0c;旨在通过深入剖析Apollo9.0开源自动驾驶软件栈中的Planning2.0模块&am…

[Python] 编程入门:理解变量类型

文章目录 [toc] 整数常见操作 浮点数字符串字符串中混用引号问题字符串长度计算字符串拼接 布尔类型动态类型特性类型转换结语 收录专栏&#xff1a;[Python] 在编程中&#xff0c;变量是用于存储数据的容器&#xff0c;而不同的变量类型则用来存储不同种类的数据。Python 与 C…

通信工程学习:什么是RARP反向地址解析协议

RARP&#xff1a;反向地址解析协议 RARP&#xff08;Reverse Address Resolution Protocol&#xff0c;反向地址解析协议&#xff09;是一种网络协议&#xff0c;其主要作用是在设备只知道物理地址&#xff08;如MAC地址&#xff09;时&#xff0c;允许其从网关服务器的地址解析…

YOLO11改进 | 卷积模块 | 轻量化GSConv替换普通的conv

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 为什么订阅我的专栏&#xff1f; 前沿技术解读&#xff1a;专栏不仅限于YOLO系列的改进&#xff0c;还会涵盖各类主流与新兴网络的最新研究成果&#xff0c;帮助你紧跟技术潮流…

使用TM1618控制LED了解P-MOS和N-MOS的开漏输出的不同

数据手册上的截取内容 手册中推荐的共阴/阳极电路 可以发现GRID总接LED的负极&#xff0c;SEG引脚接的是LED 正极 分析输出的MOS管类型可以很好的知道原因 图片来源 通过都是开漏输出可以看出&#xff0c;引脚引出的内部电路是不同的。P-mos引出的是漏极&#xff0c;导通时…

记录使用gym和stable_baseline3训练出成功通关的贪吃蛇ai

参考自b站up林亦LYi的开源项目 传送门 本次只训练了cnn版本的 第一次接触这种项目&#xff0c;建python虚拟环境时出了点难以说清楚的小问题&#xff0c;安装不上requirement.txt中的gym库那个版本&#xff0c;折腾了一会&#xff0c;自己都乱了头绪&#xff0c;最后导致训练…