导航
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('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
不是异步!
因为:
👉 会阻塞主流程
注册监听。
emitter.on('data', handler)
可以注册多个。
只执行一次,执行完自动移除。
emitter.once('ready', () => {
console.log('只触发一次')
})
内部等价于:
function wrapper() {
handler()
off()
}
取消监听。
emitter.off('data', handler)
👉 监听会一直存在
👉 内存不会释放
👉 重复触发
👉 甚至引发 MaxListeners 警告
这就是典型的:
清空某个事件。
emitter.removeAllListeners('data')