EventEmitter--Node.js 事件驱动的核心

一、介绍

Node.js 中的许多对象都会分发事件,例如:

  • net.Server 对象在每次有新连接时触发事件。

  • fs.readStream 对象在文件被打开时触发事件。

所有这些事件对象都是 events.EventEmitter 的实例。EventEmitter 是 Node.js 中用于创建、注册和触发事件的核心模块,实现了事件驱动编程的基础。

二、引入 events 模块

var events = require('events');
var eventEmitter = new events.EventEmitter();

三、基本用法示例

var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();

event.on('some_event', function() {
    console.log('some_event 事件触发');
});

setTimeout(function() {
    event.emit('some_event');
}, 1000);

执行结果:

some_event 事件触发

四、事件绑定多个监听器

var events = require('events');
var emitter = new events.EventEmitter();

emitter.on('someEvent', function(arg1, arg2) {
    console.log('listener1', arg1, arg2);
});

emitter.on('someEvent', function(arg1, arg2) {
    console.log('listener2', arg1, arg2);
});

emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');

执行结果:

listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

五、EventEmitter 方法

序号 方法 描述
1 addListener(event, listener) 添加监听器到监听器数组的尾部
2 on(event, listener) 绑定事件
3 once(event, listener) 绑定一次性监听器
4 removeListener(event, listener) 移除指定监听器
5 removeAllListeners([event]) 移除所有监听器
6 setMaxListeners(n) 设置最大监听器数量
7 listeners(event) 返回监听器数组
8 emit(event, [arg1], [arg2], [...]) 触发事件

六、once() 注册一次性事件

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

myEmitter.once('init', () => {
  console.log('Initialization event occurred');
});

myEmitter.emit('init'); // 打印: Initialization event occurred
myEmitter.emit('init'); // 不会再触发

七、监听 error 事件

myEmitter.on('error', (err) => {
  console.error('Error event triggered:', err);
});

myEmitter.emit('error', new Error('Something went wrong'));

执行结果:

Error event triggered: Error: Something went wrong

八、EventEmitter 事件

序号 事件 描述
1 newListener 添加新监听器时触发
2 removeListener 删除监听器时触发

九、listenerCount() 获取监听器数量

var eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners + " 个监听器监听连接事件。");

十、继承 EventEmitter

Node.js 核心模块(如 HTTP、fs)都是 EventEmitter 的子类。

继承示例:

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}

const customEmitter = new MyEmitter();
customEmitter.on('customEvent', () => {
  console.log('Custom event fired');
});

customEmitter.emit('customEvent');

执行结果:

Custom event fired

十一、结论

  • EventEmitter 提供了事件的发布与订阅机制,适用于事件驱动编程。

  • 可以使用 on 绑定事件,使用 emit 触发事件。

  • once 绑定一次性事件,removeListener 用于移除事件监听。

  • EventEmitter 允许继承,以创建自定义事件驱动对象。

你可能感兴趣的:(JavaScript,node.js)