Node.js EventEmitter


Node.js EventEmitter

EventEmitter 是 Node.js 的一个核心模块,它提供了一种处理事件的机制。简单来说,EventEmitter 就是一个触发器,它可以绑定事件,监听事件并触发事件。

Node.js 的各种核心模块中都有 EventEmitter 的身影,如 HTTP、Stream、Net 等模块,它们通过继承 EventEmitter 提供了事件的处理能力。

EventEmitter 的使用方式

EventEmitter 的使用方式非常简单,它提供了以下三个 API:

eventEmitter.on(eventName, listener)

这个方法用于监听 EventEmitter 对象上的 eventName 事件。当 eventName 事件被触发时,回调函数 listener 会被执行。例如:

const EventEmitter = require('events');

const myEventEmitter = new EventEmitter();

myEventEmitter.on('greet', (name) => {
    console.log(`Hello, ${name}!`);
});

myEventEmitter.emit('greet', 'John');

上面代码中,我们定义了一个 greet 事件和一个监听器。当 greet 事件被触发时,监听器会被调用,并输出 “Hello, John!"。

eventEmitter.emit(eventName[, …args])

这个方法用于触发 EventEmitter 对象上的 eventName 事件,并传入参数 args。例如:

myEventEmitter.emit('greet', 'Mary');

上面代码中,我们触发了 greet 事件,并传入了参数 Mary。

eventEmitter.removeListener(eventName, listener)

这个方法用于移除 EventEmitter 对象上的 eventName 事件的 listener 回调函数。例如:

function greet(name) {
    console.log(`Hello, ${name}!`);
}

myEventEmitter.on('greet', greet);

myEventEmitter.emit('greet', 'Lucy'); // 输出 "Hello, Lucy!"

myEventEmitter.removeListener('greet', greet);

myEventEmitter.emit('greet', 'Lucy'); // 没有任何反应

上面代码中,我们通过 myEventEmitter.removeListener() 方法移除了在 greet 事件上绑定的 greet 回调函数。因此,当 greet 事件被触发时,不会再执行该回调函数。

EventEmitter 的高级用法

除了上面所提到的基本 API 之外,EventEmitter 还提供了一些高级用法,如:

eventEmitter.once(eventName, listener)

eventEmitter.on() 方法不同,eventEmitter.once() 方法只会监听 EventEmitter 上的 eventName 事件一次。当 eventName 事件被触发时,listener 回调函数会被执行,并自动从 EventEmitter 上移除该事件的监听器。

eventEmitter.setMaxListeners(n)

默认情况下,EventEmitter 会为每个事件绑定最多 10 个 listeners。当监听器数量超过 10 时,会发出一个警告。通过 setMaxListeners() 方法可以手动设置每个事件可以最多绑定多少个监听器。

eventEmitter.listeners(eventName)

这个方法返回事件 eventName 的所有监听器函数的一个数组。

总结

EventEmitter 在 Node.js 中扮演着非常重要的角色,是事件驱动架构的基础组件,为开发者提供了一种便捷而高效的事件处理方式。熟练掌握 EventEmitter 的使用,可以使我们在实际项目中更加灵活轻便地进行事件驱动编程。