关于NodeJS中的EventEmitter

1.EventEmitter介绍

Node.js的EventEmitter是一个核心模块,用于处理事件驱动的编程。它提供了一个事件发射器类,可以在其上注册事件监听器,并在特定事件发生时触发这些监听器。

下面是 EventEmitter 的主要概念和用法:

  • 事件:事件是由 EventEmitter 类表示的字符串或数字。你可以在任何时候触发这些事件。
  • 监听器:监听器是一个函数,当特定事件被触发时,它将被调用。你可以使用 on 方法添加监听器到特定事件
  • 触发事件:使用 emit 方法可以触发一个事件,所有注册到该事件的监听器都将被调用。
  • 移除监听器:如果你不再需要一个监听器,可以使用 off 方法将其从事件中移除。
  • 一次性监听器:使用 once 方法可以添加一个只触发一次的监听器。
  • 错误事件:EventEmitter 定义了一个特殊的 error 事件,当任何其他事件失败时,都会触发该事件。

下面是一个简单的示例,演示如何使用 EventEmitter:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
    
    }

const myEmitter = new MyEmitter();

// 添加监听器
myEmitter.on('event1', () => {
    
    
  console.log('Event has been triggered!');
});

// 触发事件
myEmitter.emit('event1'); // 输出: "Event has been triggered!"

在这个示例中,我们创建了一个继承自 EventEmitter 的自定义类 MyEmitter,并创建了一个 myEmitter 实例。然后,我们使用 on 方法添加了一个监听器到 event 事件,并使用 emit 方法触发了该事件。监听器函数将输出一条消息,表示事件已被触发。

2.EventEmitter方法

  • on(eventName, listener): 监听指定事件。当事件被触发时,调用监听器函数。
  • emit(eventName, […args]): 发射指定事件,并传递参数给所有监听该事件的监听器。
  • removeListener(eventName, listener): 移除指定事件的某个监听器。
  • once(eventName, listener): 监听指定事件的单次事件。事件触发后,监听器会被自动移除。

2.1 on(eventName, listener)

为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。

myEmitter.on('event', () => {
    
    
  console.log('an event occurred!');
});

2.2 once(eventName, listener)

为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
    
    }

const myEmitter = new MyEmitter();

// 添加一次性监听器
myEmitter.once('event', () => {
    
    
    console.log('This will only happen once!');
});

// 发射事件
myEmitter.emit('event');
myEmitter.emit('event'); // 第二次发射将不会触发监听器

2.3 emit(eventName, […args])

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
    
    }

const myEmitter = new MyEmitter();

// 监听事件并接收参数
myEmitter.on('event', (arg1, arg2) => {
    
    
    console.log(`Received arguments: ${
      
      arg1} and ${
      
      arg2}`);
});

// 发射事件并传递参数
myEmitter.emit('event', 'arg1 value', 'arg2 value');

2.4 removeListener(eventName, listener)

移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。它接受两个参数,第一个是事件名称,第二个是回调函数名称。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
    
    }

const myEmitter = new MyEmitter();

const onEvent = () => {
    
    
    console.log('Event triggered!');
};

// 添加监听器
myEmitter.on('event', onEvent);

// 移除监听器
myEmitter.removeListener('event', onEvent);

// 尝试发射事件
myEmitter.emit('event'); // 不会有输出

3.EventEmitter的error事件

当你使用 EventEmitter 时,可以通过监听 ‘error’ 事件来捕获和处理错误。这是处理错误的一种标准做法,特别是在异步操作中。

const EventEmitter = require('events');
const myEmitter = new EventEmitter();
 
// 监听 'error' 事件
myEmitter.on('error', (err) => {
    
    
  console.error('捕获到错误:', err.message);
});
 
// 触发 'error' 事件
myEmitter.emit('error', new Error('出错了!'));

为什么需要监听 ‘error’ 事件?

  • 避免程序崩溃:如果你不监听 ‘error’ 事件,并且你的 EventEmitter 实例触发了一个错误,那么 Node.js 进程可能会因为未捕获的异常而崩溃。通过监听 ‘error’ 事件,你可以捕获并处理这些错误,从而避免程序非预期的终止
  • 更好的错误管理:通过监听 ‘error’ 事件,你可以更好地控制错误的传播和响应。例如,你可以记录错误、尝试恢复、或者优雅地关闭应用程序。

4.事件发射器的实际应用场景

  • 异步操作的处理: 在处理文件读取、网络请求等异步操作时,可以使用EventEmitter来监听这些操作的结果,避免回调地狱的出现。
  • 模块间通信: 在大型应用中,使用EventEmitter可以实现不同模块之间的事件通信,降低模块间的耦合度。
  • 自定义事件: 开发者可以利用EventEmitter创建自定义事件,为自己的应用增加功能。

猜你喜欢

转载自blog.csdn.net/fageaaa/article/details/146612837
今日推荐