EventEmitter 的监听是同步还是异步?如何避免泄漏?

先理解原理和示例,再练习完整口述与追问。

emit 通常同步按监听顺序调用;async listener 不等于 emit 等待;error 特殊;off/once;监听数量告警不是根因修复。

EventEmitter 是 Node 的事件分发机制,emit 通常在当前调用栈同步调用监听。监听器自己可以发起异步操作,但 emit 不会自动组合等待全部 Promise。error 事件没有合适监听时具有特殊错误行为,应按 API 契约处理;异步拒绝也不能靠想当然地被所有 error 监听接收。

长生命周期 emitter 上不断订阅且不解除,会保留闭包和资源;最大监听数告警提示潜在问题,调大上限并不会自动消除泄漏。

js
const { EventEmitter } = require('events')
const bus = new EventEmitter()
bus.on('data', () => console.log('listener'))
console.log('before')
bus.emit('data')
console.log('after') // before listener after

once 与普通监听不同,资源结束要解除相应订阅;匿名函数每次新建后无法用另一个同形匿名函数取消。

EventEmitter 默认同步分发,异步监听仍需要独立错误与等待协议。我维护监听生命周期,使用 once 或保留 handler 做 off,不通过无限调高监听上限掩盖重复注册。