Skip to content
0

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)] ]
)

更多

查看官方文档

Released under the MIT License.