EventEmitter--Node.js 事件驱动的核心

news/2025/4/1 6:23:55/

一、介绍

Node.js 中的许多对象都会分发事件,例如:

  • net.Server 对象在每次有新连接时触发事件。

  • fs.readStream 对象在文件被打开时触发事件。

所有这些事件对象都是 events.EventEmitter 的实例。EventEmitter 是 Node.js 中用于创建、注册和触发事件的核心模块,实现了事件驱动编程的基础。

二、引入 events 模块

var events = require('events');
var eventEmitter = new events.EventEmitter();

三、基本用法示例

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);

执行结果:

some_event 事件触发

四、事件绑定多个监听器

var events = require('events');
var emitter = new events.EventEmitter();emitter.on('someEvent', function(arg1, arg2) {console.log('listener1', arg1, arg2);
});emitter.on('someEvent', function(arg1, arg2) {console.log('listener2', arg1, arg2);
});emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');

执行结果:

listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

五、EventEmitter 方法

序号方法描述
1addListener(event, listener)添加监听器到监听器数组的尾部
2on(event, listener)绑定事件
3once(event, listener)绑定一次性监听器
4removeListener(event, listener)移除指定监听器
5removeAllListeners([event])移除所有监听器
6setMaxListeners(n)设置最大监听器数量
7listeners(event)返回监听器数组
8emit(event, [arg1], [arg2], [...])触发事件

六、once() 注册一次性事件

const EventEmitter = require('events');
const myEmitter = new EventEmitter();myEmitter.once('init', () => {console.log('Initialization event occurred');
});myEmitter.emit('init'); // 打印: Initialization event occurred
myEmitter.emit('init'); // 不会再触发

七、监听 error 事件

myEmitter.on('error', (err) => {console.error('Error event triggered:', err);
});myEmitter.emit('error', new Error('Something went wrong'));

执行结果:

Error event triggered: Error: Something went wrong

八、EventEmitter 事件

序号事件描述
1newListener添加新监听器时触发
2removeListener删除监听器时触发

九、listenerCount() 获取监听器数量

var eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners + " 个监听器监听连接事件。");

十、继承 EventEmitter

Node.js 核心模块(如 HTTP、fs)都是 EventEmitter 的子类。

继承示例:

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}const customEmitter = new MyEmitter();
customEmitter.on('customEvent', () => {console.log('Custom event fired');
});customEmitter.emit('customEvent');

执行结果:

Custom event fired

十一、结论

  • EventEmitter 提供了事件的发布与订阅机制,适用于事件驱动编程。

  • 可以使用 on 绑定事件,使用 emit 触发事件。

  • once 绑定一次性事件,removeListener 用于移除事件监听。

  • EventEmitter 允许继承,以创建自定义事件驱动对象。


http://www.ppmy.cn/news/1584111.html

相关文章

如何快速看懂并修改神经网络

前言:个人之见,一个神经网络网络源码出现,你先看数据集的输入和输出,而这数据集肯定要包括数据增加和制作数据集,第二 看模型的输入和输出(至于模型内部可以自己看论文 无非就是加了几个组件),然…

第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(部分题解)

文章目录 前言日期统计题意: 冶炼金属题意: 岛屿个数题意: 子串简写题意: 整数删除题意: 总结 前言 一年一度的🏀杯马上就要开始了,为了取得更好的成绩,好名字写了下前年2023年蓝桥…

【Linux】System V共享内存:零拷贝加速进程通信!

引言 本文深入探讨System V IPC中的共享内存技术,涵盖其原理、操作步骤、实现细节及与其他IPC机制的关系,助力读者全面掌握这一高效进程间通信方式。 📝 文章总结: 共享内存原理 System V共享内存通过让多个进程共享同一物理内存区…

Avro 批量转换成 Json 文件

环境准备 1. java 运行环境 2. avro-tools.jar (版本不关心,演示使用 avro-tools-1.10.2.jar)目录 avro(要转换的avro文件) json(转换后的json) avro-tools-1.10.2.jar 批量转换处理.bat (创建脚本并将下面的代码粘入…

Python命名规范与代码最优结构规范:提升PyCharm中的可读性与健壮性

Python代码规范指南:提升PyCharm中的可读性与健壮性 一个函数只做一件事,不超过150行,函数之间空两行,不要有报黄波浪线,命名规范,注意命名规范,不要想当然认为代码出什么问题要以实测为核心找…

qwen2.5vl技术报告解读

一. 首先qwen2.5vl模型特点 全能文档解析能力 升级文本识别至全场景文档解析,擅长处理多场景、多语种及复杂版式文档(含手写体、表格、图表、化学方程式、乐谱等),实现跨类型文档的精准解析。 跨格式精准目标定位 突破格式限制,大幅提升对象检测、坐标定位与数量统计精度,…

全链路压测:性能测试的流量录制和回放

全链路压测是一种模拟真实用户操作场景,对整个系统进行压力测试的方法,旨在评估系统在高负载下的性能表现。​在全链路压测中,流量录制与回放技术起着关键作用,能够捕获并重现真实的用户流量,帮助发现潜在的性能瓶颈和…

Open GL ES ->模型矩阵、视图矩阵、投影矩阵等变换矩阵数学推导以及方法接口说明

Open GL ES 变换矩阵详解 一、坐标空间变换流程 局部空间 ->Model Matrix(模型矩阵)-> 世界空间 世界空间->View Matrix(视图矩阵)->观察空间 观察空间 ->Projection Matrix(投影矩阵)->裁剪空间 裁剪空间 ->ViewPort Transform(视口变换)>屏幕空间 …