菜单

EventEmitter 和事件系统

相关源文件

本文档涵盖了 Bun 对 Node.js events 模块的实现,提供了一个完全兼容的 EventEmitter 类和相关的事件驱动编程 API。该系统是许多 Node.js 内置模块的基础,并为 Bun 运行时中的事件驱动编程模式提供了支持。

有关 EventTarget 等 Web API 事件的信息,请参阅 Web APIs and Standards Compliance。有关扩展 EventEmitter 的 Node.js 核心模块实现,请参阅 Core Modules Implementation

EventEmitter 架构

EventEmitter 系统实现为一个 JavaScript 类,该类管理事件监听器并提供触发事件的方法。核心实现完全遵循 Node.js 的语义,以确保兼容性。

来源:src/js/node/events.ts58-79 src/js/node/events.ts789-811

EventEmitter 构造函数初始化内部事件存储并处理用于拒绝捕获的可选配置

来源:src/js/node/events.ts58-78

事件触发和处理

事件触发是触发已注册监听器的核心机制。该系统支持基于 captureRejections 设置的两种触发模式。

来源:src/js/node/events.ts160-196 src/js/node/events.ts198-237

该系统通过直接使用 .call() 来优化函数调用,从而提高性能

参数数量使用的方法
0handler.$call(this)
1handler.$call(this, args[0])
2handler.$call(this, args[0], args[1])
3handler.$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

AsyncResource 集成

EventEmitterAsyncResource 类扩展了 EventEmitter,用于与 Node.js async_hooks 集成以进行异步上下文跟踪。

来源:src/js/node/events.ts789-811

该实现确保所有事件触发都在正确的异步上下文中运行

来源:src/js/node/events.ts803-805

Node.js 兼容性

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统计监听器数量函数
addAbortListenerAbortSignal 集成函数
EventEmitterAsyncResourceAsyncResource 变体class
captureRejectionSymbol拒绝处理符号symbol
errorMonitor错误监控符号symbol

来源:src/js/node/events.ts847-861 docs/runtime/nodejs-apis.md33-35