node:events
events 模块提供了事件驱动架构的主要组件 EventEmitter
import { EventEmitter } from "node:events";
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!'); //=> an event occurred!
});
myEmitter.emit('event');通过 on/addListener 注册事件,off/removeListener 移除事件,emit 触发事件
this 问题
事件回调函数不能使用箭头函数,否则 this 的引用不再是 EventEmitter 实例:
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
console.log(a, b, this);
// Prints: a b {}
});
myEmitter.on('event', function(a, b) {
console.log(a, b, this, this === myEmitter);
// Prints:
// a b MyEmitter {
// _events: [Object: null prototype] { event: [Function (anonymous)] },
// _eventsCount: 1,
// _maxListeners: undefined,
// [Symbol(kCapture)]: false
// } true
});
myEmitter.emit('event', 'a', 'b');newListener/removeListener 事件
注册/移除事件的时候会默认触发 newListener/removeListener 事件
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('removeListener', (e, listener) => {
console.log('removeListener')
e === 'event' && listener()
})
myEmitter.on('newListener', (e, listener) => {
console.log('newListener')
e === 'event' && listener()
})
function callBack() {
console.log('callBack')
}
myEmitter.on('event', callBack)
myEmitter.removeListener('event', callBack)
// Prints:
// newListener
// callBack
// removeListener
// callBack获得所有的事件名
console.log(
myEmitter.eventNames() //=> ['event', ...]
)获得事件对应的 listeners
myEmitter.on('eventA', () => {})
myEmitter.on('eventB', () => {})
console.log(
myEmitter.listeners('eventA') //=> [ [Function (anonymous)] ]
)更多
查看官方文档