NodeJs-Events

 后端   小卒子   2024-09-02 22:08   267
  nodejs

Node.js 的 Events 模块为 Node.js 应用程序提供了事件驱动的架构。核心模块 events 中的 EventEmitter 类是所有可生成事件对象的基类。

1. 引入 Events 模块

要使用事件模块,首先需要在 Node.js 文件中引入它:

const EventEmitter = require('events');

2. EventEmitter

EventEmitter 类是 Node.js 事件模块的核心。它用于创建和处理自定义事件。每个 EventEmitter 实例都可以注册多个事件和相应的事件处理函数(监听器)。

2.1 创建一个 EventEmitter 实例

要创建一个新的 EventEmitter 实例,你可以使用 new 关键字:

const myEmitter = new EventEmitter();

3. EventEmitter 的方法

EventEmitter 类提供了多种方法来操作事件和监听器:

  1. emitter.on(eventName, listener)

    为指定事件注册一个监听器。每次触发事件时都会调用此监听器。

    • eventName: 字符串或符号,表示事件的名称。
    • listener: 回调函数,当事件触发时被调用。
    const myEmitter = new EventEmitter();
    
    myEmitter.on('event', () => {
      console.log('An event occurred!');
    });
    
    myEmitter.emit('event'); // 输出: An event occurred!
    
  2. emitter.once(eventName, listener)

    为指定事件注册一个一次性监听器。事件最多触发一次,触发后立即解除绑定。

    • eventName: 字符串或符号,表示事件的名称。
    • listener: 回调函数,当事件触发时被调用。
    const myEmitter = new EventEmitter();
    
    myEmitter.once('event', () => {
      console.log('This will only run once');
    });
    
    myEmitter.emit('event'); // 输出: This will only run once
    myEmitter.emit('event'); // 不会输出任何内容
    
  3. emitter.emit(eventName[, ...args])

    触发指定事件,并传递参数给监听器。

    • eventName: 字符串或符号,表示事件的名称。
    • ...args: 传递给监听器函数的参数。
    const myEmitter = new EventEmitter();
    
    myEmitter.on('eventWithArgs', (a, b) => {
      console.log(a, b);
    });
    
    myEmitter.emit('eventWithArgs', 'arg1', 'arg2'); // 输出: arg1 arg2
    
  4. emitter.off(eventName, listener) (Node.js 10+)

    移除指定事件的某个监听器,listener 必须是原来添加时使用的函数。

    • eventName: 字符串或符号,表示事件的名称。
    • listener: 需要移除的监听器函数。
    const myEmitter = new EventEmitter();
    
    function log() {
      console.log('Event happened!');
    }
    
    myEmitter.on('event', log);
    myEmitter.off('event', log); // 移除监听器
    myEmitter.emit('event'); // 不会输出任何内容
    
  5. emitter.removeListener(eventName, listener)

    removeListener()off() 方法的别名。

    const myEmitter = new EventEmitter();
    
    function log() {
      console.log('Event happened!');
    }
    
    myEmitter.on('event', log);
    myEmitter.removeListener('event', log); // 移除监听器
    myEmitter.emit('event'); // 不会输出任何内容
    
  6. emitter.removeAllListeners([eventName])

    移除指定事件的所有监听器,或者移除所有事件的所有监听器。

    • eventName: (可选)字符串或符号,表示事件的名称。
    const myEmitter = new EventEmitter();
    
    myEmitter.on('event', () => console.log('Listener 1'));
    myEmitter.on('event', () => console.log('Listener 2'));
    
    myEmitter.removeAllListeners('event');
    myEmitter.emit('event'); // 不会输出任何内容
    
  7. emitter.listeners(eventName)

    返回指定事件的监听器数组。

    • eventName: 字符串或符号,表示事件的名称。
    const myEmitter = new EventEmitter();
    
    function listener1() {}
    function listener2() {}
    
    myEmitter.on('event', listener1);
    myEmitter.on('event', listener2);
    
    console.log(myEmitter.listeners('event')); // 输出: [ [Function: listener1], [Function: listener2] ]
    
  8. emitter.listenerCount(eventName)

    返回指定事件的监听器数量。

    • eventName: 字符串或符号,表示事件的名称。
    const myEmitter = new EventEmitter();
    
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    
    console.log(myEmitter.listenerCount('event')); // 输出: 2
    
  9. emitter.setMaxListeners(n)

    默认情况下,EventEmitter 实例最多可以注册 10 个监听器。当超过这个限制时,会输出警告。使用 setMaxListeners 可以更改监听器的数量限制。

    • n: 数字,新监听器的最大数量。
    const myEmitter = new EventEmitter();
    myEmitter.setMaxListeners(20);
    
  10. emitter.getMaxListeners()

    返回当前的监听器最大数量。

    const myEmitter = new EventEmitter();
    console.log(myEmitter.getMaxListeners()); // 输出: 10 (默认值)
    

4. EventEmitter 的事件

EventEmitter 实例也会发出一些特定事件:

  1. newListener

    当添加新的监听器时触发。新监听器在添加之前触发。

    • eventName: 字符串或符号,表示事件的名称。
    • listener: 回调函数,表示新添加的监听器。
    const myEmitter = new EventEmitter();
    
    myEmitter.on('newListener', (event, listener) => {
      console.log(`Adding listener to ${event} event.`);
    });
    
    myEmitter.on('event', () => {});
    // 输出: Adding listener to event event.
    
  2. removeListener

    当移除监听器时触发。监听器在被移除后触发。

    • eventName: 字符串或符号,表示事件的名称。
    • listener: 回调函数,表示被移除的监听器。
    const myEmitter = new EventEmitter();
    
    function listener() {
      console.log('Listener executed');
    }
    
    myEmitter.on('removeListener', (event, listener) => {
      console.log(`Removing listener from ${event} event.`);
    });
    
    myEmitter.on('event', listener);
    myEmitter.removeListener('event', listener);
    // 输出: Removing listener from event event.
    

5. 捕获错误事件

在 Node.js 中,事件驱动架构通常用于异步操作。处理错误事件对于保证应用程序的健壮性非常重要。如果 EventEmitter 实例发出 error 事件且没有相应的监听器,Node.js 将会抛出一个错误并退出程序。

const myEmitter = new EventEmitter();

// 添加错误事件的监听器
myEmitter.on('error', (err) => {
  console.error('An error occurred:', err.message);
});

// 触发错误事件
myEmitter.emit('error', new Error('Something went wrong!'));

6. 继承 EventEmitter

在实际应用中,可以创建自定义类继承 EventEmitter,从而在类中使用事件功能。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

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

myEmitter.emit('event'); // 输出: Event fired!

7. 小结

EventEmitter 是 Node.js 事件驱动架构的核心,通过它可以轻松地处理异步事件流。掌握 EventEmitter 的方法和事件,有助于开发更高效、响应更灵敏的 Node.js 应用程序。使用事件驱动编程模式可以帮助你更好地处理异步操作,提高代码的可读性和维护性。

Node.js 的 Events 模块为 Node.js 应用程序提供了事件驱动的架构。核心模块 events 中的 EventEmitter 类是所有可生成事件对象的基类。

1. 引入 Events 模块

要使用事件模块,首先需要在 Node.js 文件中引入它:

const EventEmitter = require('events');

2. EventEmitter

EventEmitter 类是 Node.js 事件模块的核心。它用于创建和处理自定义事件。每个 EventEmitter 实例都可以注册多个事件和相应的事件处理函数(监听器)。

2.1 创建一个 EventEmitter 实例

要创建一个新的 EventEmitter 实例,你可以使用 new 关键字:

const myEmitter = new EventEmitter();

3. EventEmitter 的方法

EventEmitter 类提供了多种方法来操作事件和监听器:

  1. emitter.on(eventName, listener)

    为指定事件注册一个监听器。每次触发事件时都会调用此监听器。

    • eventName: 字符串或符号,表示事件的名称。
    • listener: 回调函数,当事件触发时被调用。
    const myEmitter = new EventEmitter();
    
    myEmitter.on('event', () => {
      console.log('An event occurred!');
    });
    
    myEmitter.emit('event'); // 输出: An event occurred!
    
  2. emitter.once(eventName, listener)

    为指定事件注册一个一次性监听器。事件最多触发一次,触发后立即解除绑定。

    • eventName: 字符串或符号,表示事件的名称。
    • listener: 回调函数,当事件触发时被调用。
    const myEmitter = new EventEmitter();
    
    myEmitter.once('event', () => {
      console.log('This will only run once');
    });
    
    myEmitter.emit('event'); // 输出: This will only run once
    myEmitter.emit('event'); // 不会输出任何内容
    
  3. emitter.emit(eventName[, ...args])

    触发指定事件,并传递参数给监听器。

    • eventName: 字符串或符号,表示事件的名称。
    • ...args: 传递给监听器函数的参数。
    const myEmitter = new EventEmitter();
    
    myEmitter.on('eventWithArgs', (a, b) => {
      console.log(a, b);
    });
    
    myEmitter.emit('eventWithArgs', 'arg1', 'arg2'); // 输出: arg1 arg2
    
  4. emitter.off(eventName, listener) (Node.js 10+)

    移除指定事件的某个监听器,listener 必须是原来添加时使用的函数。

    • eventName: 字符串或符号,表示事件的名称。
    • listener: 需要移除的监听器函数。
    const myEmitter = new EventEmitter();
    
    function log() {
      console.log('Event happened!');
    }
    
    myEmitter.on('event', log);
    myEmitter.off('event', log); // 移除监听器
    myEmitter.emit('event'); // 不会输出任何内容
    
  5. emitter.removeListener(eventName, listener)

    removeListener()off() 方法的别名。

    const myEmitter = new EventEmitter();
    
    function log() {
      console.log('Event happened!');
    }
    
    myEmitter.on('event', log);
    myEmitter.removeListener('event', log); // 移除监听器
    myEmitter.emit('event'); // 不会输出任何内容
    
  6. emitter.removeAllListeners([eventName])

    移除指定事件的所有监听器,或者移除所有事件的所有监听器。

    • eventName: (可选)字符串或符号,表示事件的名称。
    const myEmitter = new EventEmitter();
    
    myEmitter.on('event', () => console.log('Listener 1'));
    myEmitter.on('event', () => console.log('Listener 2'));
    
    myEmitter.removeAllListeners('event');
    myEmitter.emit('event'); // 不会输出任何内容
    
  7. emitter.listeners(eventName)

    返回指定事件的监听器数组。

    • eventName: 字符串或符号,表示事件的名称。
    const myEmitter = new EventEmitter();
    
    function listener1() {}
    function listener2() {}
    
    myEmitter.on('event', listener1);
    myEmitter.on('event', listener2);
    
    console.log(myEmitter.listeners('event')); // 输出: [ [Function: listener1], [Function: listener2] ]
    
  8. emitter.listenerCount(eventName)

    返回指定事件的监听器数量。

    • eventName: 字符串或符号,表示事件的名称。
    const myEmitter = new EventEmitter();
    
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    
    console.log(myEmitter.listenerCount('event')); // 输出: 2
    
  9. emitter.setMaxListeners(n)

    默认情况下,EventEmitter 实例最多可以注册 10 个监听器。当超过这个限制时,会输出警告。使用 setMaxListeners 可以更改监听器的数量限制。

    • n: 数字,新监听器的最大数量。
    const myEmitter = new EventEmitter();
    myEmitter.setMaxListeners(20);
    
  10. emitter.getMaxListeners()

    返回当前的监听器最大数量。

    const myEmitter = new EventEmitter();
    console.log(myEmitter.getMaxListeners()); // 输出: 10 (默认值)
    

4. EventEmitter 的事件

EventEmitter 实例也会发出一些特定事件:

  1. newListener

    当添加新的监听器时触发。新监听器在添加之前触发。

    • eventName: 字符串或符号,表示事件的名称。
    • listener: 回调函数,表示新添加的监听器。
    const myEmitter = new EventEmitter();
    
    myEmitter.on('newListener', (event, listener) => {
      console.log(`Adding listener to ${event} event.`);
    });
    
    myEmitter.on('event', () => {});
    // 输出: Adding listener to event event.
    
  2. removeListener

    当移除监听器时触发。监听器在被移除后触发。

    • eventName: 字符串或符号,表示事件的名称。
    • listener: 回调函数,表示被移除的监听器。
    const myEmitter = new EventEmitter();
    
    function listener() {
      console.log('Listener executed');
    }
    
    myEmitter.on('removeListener', (event, listener) => {
      console.log(`Removing listener from ${event} event.`);
    });
    
    myEmitter.on('event', listener);
    myEmitter.removeListener('event', listener);
    // 输出: Removing listener from event event.
    

5. 捕获错误事件

在 Node.js 中,事件驱动架构通常用于异步操作。处理错误事件对于保证应用程序的健壮性非常重要。如果 EventEmitter 实例发出 error 事件且没有相应的监听器,Node.js 将会抛出一个错误并退出程序。

const myEmitter = new EventEmitter();

// 添加错误事件的监听器
myEmitter.on('error', (err) => {
  console.error('An error occurred:', err.message);
});

// 触发错误事件
myEmitter.emit('error', new Error('Something went wrong!'));

6. 继承 EventEmitter

在实际应用中,可以创建自定义类继承 EventEmitter,从而在类中使用事件功能。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

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

myEmitter.emit('event'); // 输出: Event fired!

7. 小结

EventEmitter 是 Node.js 事件驱动架构的核心,通过它可以轻松地处理异步事件流。掌握 EventEmitter 的方法和事件,有助于开发更高效、响应更灵敏的 Node.js 应用程序。使用事件驱动编程模式可以帮助你更好地处理异步操作,提高代码的可读性和维护性。