Node.js 中的 Event 模块详解

技术分享:NodeJS中的Events(事件触发器)讲解 在 Node.js 中,Event是非常核心的模块,大部分的核心模块基本上都有用到或者继承了该模块。 Event模块和我们之前在Javascript中学习的EventTarget接口很类似。对于该模块我们能做的不仅仅是简单的使用还可以在该模块的基础上做出扩展,你想想JS中的onclick、onmousemove 不罗嗦,直接上代码! 因为事件模块属于比较抽象的东西,所以不太适合用大篇幅的语言来描述它,所以我决定直接上代码,先实现功能看效果再说。下面就一起来体验下这个模块的功能吧。 对自定义类进行扩展 在前端 阅读详情

Node.js 中的 Event 模块是实现事件驱动编程的核心模块。它基于观察者模式,允许对象(称为“事件发射器”)发布事件,而其他对象(称为“事件监听器”)可以订阅并响应这些事件。这种模式非常适合处理异步操作和事件驱动的场景。


1. 概念

1.1 事件驱动编程

事件驱动编程是一种编程范式,程序的执行流程由事件(如用户输入、文件读取完成、网络请求响应等)决定。Node.js 的核心设计理念就是基于事件驱动的非阻塞 I/O 模型。

1.2 事件发射器(EventEmitter)

EventEmitter 是 Node.js 中实现事件驱动编程的核心类。它提供了以下功能:

  • 发布事件:通过 emit() 方法触发事件。
  • 订阅事件:通过 on() 或 addListener() 方法监听事件。
  • 取消订阅:通过 removeListener() 或 off() 方法移除事件监听器。

2. 定义与用法

2.1 引入 EventEmitter

EventEmitter 是 events 模块的一个类,使用前需要引入:

const EventEmitter = require('events');

2.2 创建事件发射器

可以通过继承 EventEmitter 或直接实例化来创建事件发射器。

方法 1:直接实例化
const EventEmitter = require('events');

// 创建事件发射器实例
const myEmitter = new EventEmitter();

// 监听事件
myEmitter.on('greet', (name) => {
  console.log(`Hello, ${name}!`);
});

// 触发事件
myEmitter.emit('greet', 'Alice'); // 输出:Hello, Alice!
方法 2:继承 EventEmitter
const EventEmitter = require('events');

// 自定义类继承 EventEmitter
class MyEmitter extends EventEmitter {}

// 创建自定义类的实例
const myEmitter = new MyEmitter();

// 监听事件
myEmitter.on('greet', (name) => {
  console.log(`Hello, ${name}!`);
});

// 触发事件
myEmitter.emit('greet', 'Bob'); // 输出:Hello, Bob!

2.3 常用方法

1. on(eventName, listener)
  • 监听指定事件。
  • eventName:事件名称。
  • listener:事件触发时的回调函数。
myEmitter.on('data', (data) => {
  console.log('Data received:', data);
});
2. emit(eventName[, ...args])
  • 触发指定事件。
  • eventName:事件名称。
  • args:传递给监听器的参数。
myEmitter.emit('data', { message: 'Hello, world!' });
3. once(eventName, listener)
  • 监听事件,但只触发一次。
  • 触发后自动移除监听器。
myEmitter.once('init', () => {
  console.log('Initialized!');
});

myEmitter.emit('init'); // 输出:Initialized!
myEmitter.emit('init'); // 无输出
4. removeListener(eventName, listener)
  • 移除指定事件的监听器。
const listener = (data) => {
  console.log('Data received:', data);
};

myEmitter.on('data', listener);
myEmitter.removeListener('data', listener);
5. off(eventName, listener)
  • removeListener 的别名,功能相同。
6. removeAllListeners([eventName])
  • 移除所有监听器,或指定事件的所有监听器。
myEmitter.removeAllListeners('data');
7. listenerCount(eventName)
  • 返回指定事件的监听器数量。
const count = myEmitter.listenerCount('data');
console.log('Listener count:', count);

3. 优缺点

3.1 优点

  1. 解耦:
    • 事件驱动模式将事件的发布和订阅解耦,使代码更模块化和可维护。
  2. 异步支持:
    • 非常适合处理异步操作,如文件 I/O、网络请求等。
  3. 灵活性:
    • 可以动态添加或移除事件监听器,适应不同的业务需求。
  4. 内置支持:
    • Node.js 的许多核心模块(如 fs、net、http)都基于 EventEmitter。

3.2 缺点

  1. 回调地狱:
    • 如果事件嵌套过多,可能会导致回调地狱,降低代码可读性。
  2. 错误处理:
    • 如果没有正确监听 error 事件,可能会导致程序崩溃。
  3. 内存泄漏:
    • 如果未及时移除监听器,可能会导致内存泄漏。
  4. 调试困难:
    • 事件驱动的代码流程不如同步代码直观,调试起来可能更复杂。

4. 最佳实践

4.1 错误处理

始终监听 error 事件,避免未捕获的错误导致程序崩溃。

myEmitter.on('error', (err) => {
  console.error('Error occurred:', err.message);
});

myEmitter.emit('error', new Error('Something went wrong!'));

4.2 避免内存泄漏

及时移除不再需要的监听器。

const listener = () => {
  console.log('Event triggered');
};

myEmitter.on('event', listener);

// 移除监听器
myEmitter.off('event', listener);

4.3 使用 once 替代 on

如果事件只需要触发一次,使用 once 而不是 on,避免手动移除监听器。

myEmitter.once('init', () => {
  console.log('Initialized!');
});

5. 示例:文件读取事件

以下是一个结合 fs 模块的文件读取示例:

const fs = require('fs');
const EventEmitter = require('events');

class FileReader extends EventEmitter {
  readFile(filePath) {
    fs.readFile(filePath, 'utf8', (err, data) => {
      if (err) {
        this.emit('error', err);
      } else {
        this.emit('data', data);
      }
    });
  }
}

const reader = new FileReader();

reader.on('data', (data) => {
  console.log('File content:', data);
});

reader.on('error', (err) => {
  console.error('Failed to read file:', err.message);
});

reader.readFile('example.txt');

6. 总结

  • EventEmitter 是 Node.js 中实现事件驱动编程的核心工具。
  • 优点:解耦、异步支持、灵活性高。
  • 缺点:回调地狱、错误处理复杂、可能内存泄漏。
  • 适用场景:异步操作、事件驱动的应用(如服务器、文件 I/O 等)。

通过合理使用 EventEmitter,可以编写出高效、模块化的 Node.js 应用程序。

node.js学习-events nodejs部分-events 阅读详情

相关推荐

Node之Event模块

写在前面事件的编程方式具有轻量级、松耦合、只关注事务点等优势,在浏览器端,有着自己的一套DOM事件机制,其中含包括这诸如事件冒泡,事件捕获等;然而Node的事件机制没有事件冒泡等,其原理就是设计模式中的观察者模式。Node很多的模块继承这个事件模块,下面我们就来根据源码来学习下其API,做到知其然更知其所以然。引入模块const EventEmitter = require("events"); c

zp1996323的博客 1761

NodeJs内置模块二:Events模块

NodeJs内置模块二:Events模块。

weixin_51139133的博客 425

浏览器与Node的事件循环(Event Loop)有何区别?

前言 本文我们将会介绍 JS 实现异步的原理,并且了解了在浏览器和 Node 中 Event Loop 其实是不相同的。 一、线程与进程 1. 概念 我们经常说 JS 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程? 官方的说法是:进程是 CPU 资源分配的最小单位;线程是 CPU 调度的最小单位。这两句话并不好理解,我们先来看张图: 进程好比图中的工厂,有单独的...

Fundebug博客 8305

Node 中的Event模块详解

Events是node.js最重要的模块,它提供了一个对象events.EventEmitter,EventEmitter 的核心是事件发射与事件监听器。 Node.js中大部分的模块,都继承自Event模块。 EventEmitter 支持若干个事件监听器,当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。 事件模块相关的方法主要有以下这些: 1. Ev......

分享前端工程化、AI 应用、Agent 开发与大模型实践! 2471

Node.js | 使用内置模块 event 实现发布订阅模式

对于发布订阅模式想必大家并不陌生,它在异步交互中具有很大的作用,能够使我们的代码结构更加清晰易读,便于维护。 在node.js中我们可以使用 内置模块`event`来实现发布订阅模式,这篇文章我们将深入去学习event并演示它在我们实际开发中的应用,快来看看吧!...

前端之行,任重道远! 6035

Node内置模块 【Event事件模块】

Node内置模块 【Event事件模块】

商务合作/软件定制/学习交流 737

NodeJS之events模块

文章目录1 Event模块1.1 概述1.1.1 基本用法1.1.2 on方法1.1.3 emit方法1.2 EventEmitter接口的部署1.3 事件类型1.4 EventEmitter实例的方法1.4.1 once方法1.4.2 removeListener方法1.4.3 removeAllListeners方法1.4.4 listener方法 1 Event模块 1.1 概述 1.1.1...

上善若泪 2656

【机器学习—评估指标】混淆矩阵、准确率、精确率、召回率、F1分数、ROC曲线和AUC

机器学习评价指标是衡量模型性能的关键工具。本文介绍了常见指标及其计算方法:1.混淆矩阵展示分类预测结果分布,包含TP、TN、FP、FN四个基础指标;2.准确率反映整体预测正确率;3.精确率关注预测正例的准确性;4.召回率衡量正例检出能力;5.F1分数综合平衡精确率和召回率;6.ROC曲线通过TPR与FPR的权衡关系评估模型性能,AUC值量化区分能力。文章详细说明了各指标的定义、计算公式、适用场景及局限性,并通过Python代码示例演示了具体实现方法,特别对ROC曲线和AUC的计算原理进行了深入解析。

weixin_51375278的博客 6745

Day 2|Node.js 运行机制、模块系统与异步初探

搞懂 Node.js 在“后台是怎么跑的”,并能写最基础的 Node 脚本

weixin_43837395的博客 687

Altair HyperWorks 2022.3.0 Suite下载

Altair HyperWorks开发团队提供了新的一流技术,以设计和优化高性能、高效和创新的产品,并发布了HyperWorks 2021.2套件。与所有新版本一样,这个版本包含了新特性、增强功能,并修复了前一个版本中用户报告的各种问题,提供了总体上更稳定的体验。链接: https://pan.baidu.com/s/1rYietmQLQUboHiJzYoE9WQ?pwd=m9yh 提取码: m9yh 复制这段内容后打开百度网盘手机App,操作更方便哦。

weixin_48469365的博客 2127

大厂嵌入式面试常考八股文及算法

1.指向已被释放或无效的内存地址的指针是野指针。互斥锁是一种用于线程同步的机制,用于确保同一时间只有一个线程访问共享资源。多态是面向对象编程中的一种特性,它允许以一种统一的方式处理不同类型的对象,通过相同的接口可以表现出不同的行为。大小端(Endian)指的是在计算机存储和处理多字节数据时,字节的存储顺序。大端序(Big Endian):高位字节存储在低地址,低位字节存储在高地址。类似于将数字的高位放在左边,低位放在右边的表示方式。例如整数值0x12345678在内存中按照大端序排列为。

谢谢大家的关注 6159

免费版 vs 专业版 vs 定制授权:Seedance 2.0 SDK Node.js 部署成本拆解,92%团队低估了License Runtime 费用!

帮你精准预估Seedance 2.0 SDK在Node.js环境的部署成本,避免License Runtime费用超支。本文提供免费版、专业版与定制授权的收费标准对比,覆盖QPS限制、并发数、商用范围等关键维度,92%团队因忽略Runtime计费被低估总成本。值得收藏,点击了解完整拆解。

InstrGap的博客 290

C# 实现文件和字符串的AES加密解密

C# 实现文件和字符串的AES128加密解密

m0_72044573的博客 5935

node util 继承 和 event 事件驱动

###1.util 全局变量 ######1.1util.inherits(constructor,superConstructor) 这里是一个实现对象间原型继承的函数。 代码如下: 声明一个People对象 var util=require('util'); function People(){ this.name = 'people name'; this.age=20; this....

weixin_34051201的博客 93

PHP项目实战:易宝支付SDK对接全流程(含回调处理与常见问题排查)

本文详细介绍了PHP项目中易宝支付SDK的对接全流程,包括环境准备、SDK配置、支付请求构建与发起、回调处理实战以及常见问题排查。特别针对回调处理环节的常见问题提供了解决方案,帮助开发者快速完成支付对接并优化性能。

weixin_29007809的博客 388

新装Win10/Win11后VMware虚拟机连不上网?手把手教你排查‘网络信息不可用’(从服务检查到网段配置)

本文详细介绍了在Windows 10/11系统上安装VMware Workstation后虚拟机无法联网的排查方法。从检查VMware NAT Service、DHCP Service等关键服务状态,到重置虚拟网络编辑器配置,再到内核设备驱动问题解决,手把手教你解决‘网络信息不可用’问题。特别针对VMCI驱动故障提供了实用解决方案,帮助用户快速恢复虚拟机网络连接。

weixin_28736335的博客 770

nodejs事件驱动Event使用步骤

Event使用步骤: 1、引入event类EventEmitter const EventEmitter = require("events").EventEmitter; 2、实例化一个EventEmitter的对象 let event = new EventEmitter(); 3、EventEmitter的实例方法和属性: addListener : 注册一个事件监听,当emit...

Steamgirl的博客 369

腾讯音乐 QQ音乐商业化客户端开发工程师:岗位深度解析与面试攻略

腾讯音乐QQ音乐商业化客户端开发工程师岗位要求3年以上Android开发经验,熟练掌握Kotlin/Java及跨端开发技术。核心职责包括QQ音乐客户端功能开发、架构优化、性能提升及技术攻关。岗位要求计算机相关本科以上学历,具备完整项目开发经验,熟悉TCP/IP等网络协议,能独立解决复杂技术问题。面试重点考察项目经验、架构设计、性能优化及新技术研究能力,建议候选人准备具体案例,量化成果,并熟悉Flutter等跨端技术。该职位强调技术深度与产品思维的结合,需展现扎实的编程基础、问题解决能力和团队协作精神。

郑伟强dev的专栏 366

Node process&模块化规范&eventloop

process process.env 表示的是当前系统中的一些环境。 环境变量分为两种:用户变量、系统变量。 设置环境变量的两种语法: windows系统→ set a = 1,mac系统→ export b = 2 执行代码时传入环境 node test.js --port 8085 --method kill // 解析命令行传入的指令 let env = process.argv.slice(2).reduce((memo, current, index, arr) => { i

前端下午茶 263

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

到底什么是Event Loop?那就来了解一下JavaScript分别在浏览器和Node环境下的运行机制吧

浏览器中的各种Web API为异步的代码提供了一个单独的运行空间,当异步的代码运行完毕以后,会将代码中的回调送入到Task Queue(任务队列)中去,等到调用栈空时,再将队列中的回调函数压入调用栈中执行,等到栈空以及任务队列也为空时,调用栈仍然会不断检测任务队列中是否有代码需要执行,这一过程就是完整的Event Loop 了

零一的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Node.js Event emitter 详解( 示例代码 )

Node.js 中的 `EventEmitter` 是一个内置模块,它提供了一种简单的方式来创建和管理事件。几乎所有的Node.js异步操作都是基于事件驱动的,而 `EventEmitter` 类就是这一切的基础。通过它,你可以定义自定义事件,并监听这些事件的发生,以此来实现代码的解耦和异步通信。

大剑师兰特的GIS世界 1652

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【前端小白】Event Loop理解 异步 JavaScript Node.JS

首先,event loop是一个执行模型,在浏览器中和node.js中实现不一样。 浏览器中,Eventloop是基于html5标准,而node.js是基于libux。 首先有宏任务与微任务 一:宏任务macrotask 包括: script setTimeout setInterval setImmediate(这是node.js的方法) I/O UI renderi...

shi_Avicii的博客 340

Node.js的Event Loop:六个阶段详解

本文将详细介绍Node.js中的Event Loop,包括六个阶段:定时器、I/O事件、监控器、异步代码、微任务和宏任务。Event Loop是Node.js的核心机制,用于处理异步I/O事件。它通过回调函数、事件发射器和工作队列等组件来实现。Node.js的Event Loop(事件循环)是Node.js处理异步编程的核心机制。它负责监听和处理JavaScript代码中异步事件的回调。

你若盛开,清风自来 1744

【Node.js】 模块

目录模块系统模块接口events模块util 模块fs 模块OS 模块Path 模块Net 模块DNS 模块Domain 模块http 模块url 模块gulp 模块Webpack 模块 模块系统 参考资料:Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。 换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++

小数点儿_ 1876

node.js的部分内置模块

node.js的内置模块就是node本身提供的模块,不用下载,直接使用require引入就可以使用这些模块的方法了。 详情可以查看node.js的官方文档,修改地址中v后面的数字就可以查看不同的版本了 https://nodejs.org/dist/latest-v11.x/docs/api/ 下面我来简单介绍几个常用的模块 File System模块 就是文件和文件夹的操作模块,主要对...

刀马的博客 4130
上一篇: Node.js的API之dgram的用法详解
下一篇: Node.js 中的 fs 模块详解
小灰灰学编程
博客等级 码龄7年 1247粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值