本文档涵盖了 Bun 对 Node.js events 模块的实现,提供了一个完全兼容的 EventEmitter 类和相关的事件驱动编程 API。该系统是许多 Node.js 内置模块的基础,并为 Bun 运行时中的事件驱动编程模式提供了支持。
有关 EventTarget 等 Web API 事件的信息,请参阅 Web APIs and Standards Compliance。有关扩展 EventEmitter 的 Node.js 核心模块实现,请参阅 Core Modules Implementation。
EventEmitter 系统实现为一个 JavaScript 类,该类管理事件监听器并提供触发事件的方法。核心实现完全遵循 Node.js 的语义,以确保兼容性。
来源:src/js/node/events.ts58-79 src/js/node/events.ts789-811
EventEmitter 构造函数初始化内部事件存储并处理用于拒绝捕获的可选配置
事件触发是触发已注册监听器的核心机制。该系统支持基于 captureRejections 设置的两种触发模式。
来源:src/js/node/events.ts160-196 src/js/node/events.ts198-237
该系统通过直接使用 .call() 来优化函数调用,从而提高性能
| 参数数量 | 使用的方法 |
|---|---|
| 0 | handler.$call(this) |
| 1 | handler.$call(this, args[0]) |
| 2 | handler.$call(this, args[0], args[1]) |
| 3 | handler.$call(this, args[0], args[1], args[2]) |
| 4+ | handler.$apply(this, args) |
来源:src/js/node/events.ts177-193
EventEmitter 提供了全面的方法来管理事件监听器,支持不同类型的监听器和排序。
来源:src/js/node/events.ts241-287 src/js/node/events.ts326-330 src/js/node/events.ts365-397
once 实现使用了一个包装函数,该函数在执行后会自动移除自身
来源:src/js/node/events.ts302-317
EventEmitter 实现了复杂的错误处理,支持从异步事件处理程序捕获 Promise 拒绝。
来源:src/js/node/events.ts96-135
拒绝捕获机制处理来自异步事件处理程序的 Promise 拒绝
来源:src/js/node/events.ts137-158
EventEmitter 通过静态 on 方法提供异步迭代功能,允许将事件作为异步可迭代对象进行消费。
来源:src/js/node/events.ts484-628
异步迭代器的实现使用了一个复杂的队列管理系统,带有反压控制
| 参数 | 目的 | 默认 |
|---|---|---|
highWaterMark | 暂停前的最大排队事件数 | Number.MAX_SAFE_INTEGER |
lowWaterMark | 恢复阈值 | 1 |
signal | 用于取消的 AbortSignal | 未定义 |
close | 关闭事件名称数组 | 未定义 |
来源:src/js/node/events.ts484-496
events 模块提供了几个实用函数,用于统一处理 EventEmitter 和 EventTarget。
来源:src/js/node/events.ts437-477 src/js/node/events.ts654-680 src/js/node/events.ts689-701
实用函数通过非特定的辅助函数处理 EventEmitter 实例和 EventTarget 对象
来源:src/js/node/events.ts716-738
EventEmitterAsyncResource 类扩展了 EventEmitter,用于与 Node.js async_hooks 集成以进行异步上下文跟踪。
来源:src/js/node/events.ts789-811
该实现确保所有事件触发都在正确的异步上下文中运行
来源:src/js/node/events.ts803-805
Bun 的 EventEmitter 实现实现了与 Node.js 的 100% 兼容性,通过了 Node.js 的所有测试套件。该实现包含一些 Node.js 特有的功能和符号。
来源:src/js/node/events.ts44-50 src/js/node/events.ts812-861
该模块的导出保持与 Node.js 的完全兼容
| 导出 | 目的 | 类型 |
|---|---|---|
EventEmitter | 主构造函数 | 函数 |
once | 基于 Promise 的单次事件 | 函数 |
on | 事件的异步迭代 | 函数 |
getEventListeners | 跨平台监听器访问 | 函数 |
setMaxListeners | 设置监听器限制 | 函数 |
getMaxListeners | 获取监听器限制 | 函数 |
listenerCount | 统计监听器数量 | 函数 |
addAbortListener | AbortSignal 集成 | 函数 |
EventEmitterAsyncResource | AsyncResource 变体 | class |
captureRejectionSymbol | 拒绝处理符号 | symbol |
errorMonitor | 错误监控符号 | symbol |
来源:src/js/node/events.ts847-861 docs/runtime/nodejs-apis.md33-35