导航


HTML

CSS

JavaScript

浏览器 & 网络

版本管理

框架

构建工具

TypeScript

性能优化

算法

UI、组件库

Node

业务技能

针对性攻坚

AI

公共类


一、events 是什么?

Node 的 events 模块提供了一个类:

const { EventEmitter } = require('events')

它实现的是:

发布 → 订阅(pub/sub)模式


举个最简单的例子

const emitter = new EventEmitter()

emitter.on('data', (msg) => {
  console.log('收到:', msg)
})

emitter.emit('data', 'hello')

输出:

收到: hello

可以理解为:

emit = 广播
on   = 监听广播


二、底层工作模型(非常重要)

EventEmitter 内部可以简单理解为:

{
  eventName: [listener1, listener2, listener3]
}

当 emit 时:

emit('data')

它会:

for (listener of listeners) {
  listener()
}

按注册顺序,同步执行。


⚠️ 注意:默认是同步的!

emitter.on('a', () => console.log(1))
emitter.on('a', () => console.log(2))

emitter.emit('a')
console.log(3)

输出:

1
2
3

不是异步!


为什么这个点很重要?

因为:

👉 会阻塞主流程



三、常用 API 全面讲解


1️⃣ on / addListener

注册监听。

emitter.on('data', handler)

可以注册多个。



2️⃣ once

只执行一次,执行完自动移除。

emitter.once('ready', () => {
  console.log('只触发一次')
})

内部等价于:

function wrapper() {
  handler()
  off()
}

使用场景



3️⃣ off / removeListener

取消监听。

emitter.off('data', handler)

如果不 remove 会怎样?

👉 监听会一直存在

👉 内存不会释放

👉 重复触发

👉 甚至引发 MaxListeners 警告

这就是典型的:

🚨 EventEmitter 内存泄露来源



4️⃣ removeAllListeners

清空某个事件。

emitter.removeAllListeners('data')