EventEmitter 是 Node.js 内置 events 模块中的类,用于实现发布-订阅模式的异步事件驱动编程,支持 on/once 监听、emit 触发、off 移除等操作,是构建松耦合模块的核心工具。

Node.js 中的 EventEmitter 是实现异步事件驱动编程的核心工具,它让对象可以监听和响应自定义事件,是构建可扩展、松耦合模块的基础。
EventEmitter 是什么?
EventEmitter 是 Node.js 内置模块 events 中的类,用于发布-订阅模式:一个对象可以 发射(emit) 事件,其他对象可以 监听(on / once) 这些事件并执行回调。它不是浏览器原生 API,仅在 Node.js 环境可用(或通过 polyfill 在部分前端场景模拟)。
基本用法:创建、监听与触发
使用前需先引入并实例化:
// 引入 events 模块并创建实例
const { EventEmitter } = require('events');<br>
const emitter = new EventEmitter();
常用操作包括:
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
立即学习“Java免费学习笔记(深入)”;
-
绑定监听器:
emitter.on('event', callback)—— 持续监听,每次 emit 都触发 -
一次性监听:
emitter.once('event', callback)—— 触发一次后自动移除 -
触发事件:
emitter.emit('event', arg1, arg2, ...)—— 向所有监听者传递参数 -
移除监听器:
emitter.off('event', callback)或emitter.removeListener(...) -
查看监听器数量:
emitter.listenerCount('event'),有助于排查内存泄漏
重要细节与注意事项
理解这些行为能避免常见陷阱:
- 监听器按注册顺序同步执行,不自动异步化;如需异步,需手动包裹
setImmediate或process.nextTick - 默认最多允许 10 个监听器同名事件,超出会打印警告(可通过
emitter.setMaxListeners(n)调整) -
emit返回布尔值:true 表示至少有一个监听器,false 表示无监听器,可用于条件逻辑 - 监听器内部抛出错误不会中断其他监听器执行,但会触发
'error'事件;若未监听'error',Node.js 将抛出未捕获异常并退出进程 - 继承
EventEmitter推荐用 ES6 class +Object.setPrototypeOf(this, EventEmitter.prototype),或直接使用util.inherits(旧方式)
实际应用场景举例
EventEmitter 广泛用于 Node.js 核心模块和业务抽象中:
-
文件操作:如
fs.ReadStream继承自 EventEmitter,可监听'data'、'end'、'error' -
HTTP 服务:
http.Server对象在收到请求时 emit'request'事件 -
自定义状态管理:例如数据库连接池在连接就绪时 emit
'ready',各模块按需响应 -
插件系统:主程序 emit 生命周期事件(如
'beforeStart'),插件注册监听器介入流程

















