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

Node.js events模块所有 API 详解 + 常用 API + 使用场景

events 模块是 Node.js 内置的一个 事件驱动机制模块,提供了发布/订阅模式(观察者模式)的实现。
几乎所有 Node.js 核心模块(如 httpfsnetstream)都是基于 events 模块实现的。

核心类是 EventEmitter,通过它我们可以注册事件、触发事件、移除事件监听等。


一、引入模块

const EventEmitter = require('events');
const emitter = new EventEmitter();

二、EventEmitter 的所有 API

1. 事件监听相关

API说明示例
emitter.on(eventName, listener)为指定事件添加一个监听器,事件可以被多次监听emitter.on('data', msg => console.log(msg));
emitter.addListener(eventName, listener)on 的别名
emitter.once(eventName, listener)注册一次性监听器,触发一次后自动移除emitter.once('login', user => console.log(user));
emitter.prependListener(eventName, listener)将监听器添加到监听队列的开头(默认是结尾)
emitter.prependOnceListener(eventName, listener)同上,但只执行一次

2. 事件触发相关

API说明示例
emitter.emit(eventName[, ...args])触发事件,并传递参数给监听器emitter.emit('data', 'hello');
emitter.listenerCount(eventName)获取某个事件的监听器数量
emitter.listeners(eventName)返回一个数组,包含所有监听器函数
emitter.rawListeners(eventName)返回监听器数组(包含 once 包装的原始函数)

3. 移除监听器相关

API说明示例
emitter.off(eventName, listener)移除某个监听器(Node v10+ 推荐)
emitter.removeListener(eventName, listener)off 的旧写法
emitter.removeAllListeners([eventName])移除指定事件或所有事件的监听器

4. 事件属性设置

API说明示例
emitter.eventNames()返回所有注册过的事件名数组
emitter.setMaxListeners(n)设置某个 EventEmitter 实例的最大监听器数量(默认 10,超过会有警告)
emitter.getMaxListeners()获取最大监听数
emitter.defaultMaxListeners静态属性,所有实例默认的最大监听数

5. 继承 EventEmitter

几乎所有自定义类都可以继承 EventEmitter,从而具备事件驱动能力。

const EventEmitter = require('events');class MyServer extends EventEmitter {start() {console.log('Server starting...');this.emit('start', Date.now());}
}const server = new MyServer();
server.on('start', time => console.log('Started at:', time));
server.start();

三、常用 API 总结

最常用的 API 有以下几个:

  1. on / once → 注册事件监听

  2. emit → 触发事件

  3. off / removeListener → 移除监听

  4. setMaxListeners / getMaxListeners → 解决内存泄漏警告

  5. listenerCount → 查看监听器数量(调试常用)


四、典型使用场景

1. 异步回调替代方案

const emitter = new EventEmitter();function fetchData() {setTimeout(() => {emitter.emit('data', { user: 'Alice' });}, 1000);
}emitter.on('data', data => {console.log('接收到数据:', data);
});fetchData();

2. 发布-订阅模式

多个模块之间通过事件通信,而不是直接调用:

// publisher.js
const EventEmitter = require('events');
const bus = new EventEmitter();
module.exports = bus;// subscriberA.js
const bus = require('./publisher');
bus.on('orderCreated', order => console.log('通知A处理:', order));// subscriberB.js
const bus = require('./publisher');
bus.on('orderCreated', order => console.log('通知B处理:', order));// main.js
const bus = require('./publisher');
bus.emit('orderCreated', { id: 1, product: 'iPhone' });

3. 流 (Stream) 内部机制

stream 模块的 data, end, error 都是基于 events 实现。

const fs = require('fs');
const readStream = fs.createReadStream('./file.txt');readStream.on('data', chunk => console.log('读取:', chunk.toString()));
readStream.on('end', () => console.log('读取完成'));

4. 错误处理

事件驱动模型下,必须捕获 error 事件,否则程序会崩溃。

emitter.on('error', err => console.error('捕获错误:', err));
emitter.emit('error', new Error('出错了'));

5. 大型系统中的消息总线

在 Node.js 微服务或大型项目中,可以用 EventEmitter 做应用内的 事件总线,用于模块解耦。


五、注意事项

  1. 没有监听 error 事件会导致程序崩溃

  2. 默认最大监听器是 10,超出会有内存泄漏警告,需要 setMaxListeners()

  3. 同步执行:事件监听器默认是同步执行的,要避免阻塞主线程。

    • 如果想异步执行,可以用 process.nextTick()setImmediate() 包装。


✅ 总结下来:

  • events 模块的核心是 EventEmitter,实现了 观察者模式

  • 最常用的方法:on / once / emit / off / setMaxListeners

  • 使用场景包括:模块通信、流处理、错误捕获、消息总线、异步任务管理。

http://www.dtcms.com/a/478992.html

相关文章:

  • 便携式EL检测仪:重构光伏质检流程
  • 安庆网站建设推荐秒搜科技网站右侧虚代码
  • 研究生核心课程建设网站深圳网站建设top028
  • 网站建设伍金手指下拉2加强网站硬件建设方案
  • Pytest单元测试一例:u16采样值格式转换的错误
  • 源码网站php什么事网站建设
  • Pytest与Unittest测试框架对比
  • 旅游网站建设的方向连接交换
  • 路径平滑优化详解(二次规划): 数学建模与目标函数推导
  • 昂瑞微:射频与模拟芯片领域的国产领军者
  • 互联网医院小程序源码实操:在线问诊功能快速实现
  • 数字电源和模拟电源隔离的原理
  • 搬瓦工wordpress建站软件开发公司哪家强
  • 常见的PHP框架安全防护函数详解!
  • 《Qt应用开发》笔记p4
  • 用 Matplotlib 实现数据可视化3 个案例实战
  • PS4资源汇总:PS4游戏18T+合集1700多个游戏+固件+主题+金手指+模拟器
  • 营销型网站设计价格app软件商店
  • 网站开发的工作环境wordpress没有链接
  • Spring Web MVC入门补充1
  • 反悔贪心 系列
  • 十二、OpenCV中的边缘检测
  • 个人网站 摄影展示wordpress神箭手
  • 天津网站建设icp备微建网站
  • 软考~系统规划与管理师考试——真题篇——章节——第20章 数字乡村发展规划——纯享题目版
  • 旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
  • 网站设计需求方案wordpress转成中文版
  • 最佳经验网站网站有哪些布局
  • 爬虫的基本流程:从发送请求到数据清洗的完整链路
  • 大连手机自适应网站制作价格百度权重查询