当前位置: 首页 > article >正文

nodejs入门教程8:nodejs EventEmitter

一、EventEmitter的基本概念

EventEmitter是Node.js事件驱动编程的核心。它允许你定义自定义事件,并监听这些事件的发生,以此来实现代码的解耦和异步通信。EventEmitter类实现了Node异步事件驱动架构的基本模式——观察者模式。在这种模式中,被观察者(主体)维护着一组其他对象派来(注册)的观察者,有新的对象对主体感兴趣就注册观察者,不感兴趣就取消订阅,主体有更新的话就依次通知观察者们。

二、EventEmitter的使用方法

1. 引入EventEmitter

要使用EventEmitter,首先需要从events模块引入它:

const EventEmitter = require('events');
2. 创建EventEmitter实例

通过实例化EventEmitter类来创建一个EventEmitter对象:

const myEmitter = new EventEmitter();
3. 注册事件监听器

使用onaddListener方法注册事件监听器。这些方法接受两个参数:事件名称和当事件触发时要执行的回调函数。

myEmitter.on('event', () => {
  console.log('事件触发了!');
});
4. 触发事件

使用emit方法触发一个事件。传递给事件处理程序的任何参数都将被传递给监听器。

myEmitter.emit('event'); // 输出: 事件触发了!

三、EventEmitter的常用方法

方法描述
on(eventName, listener)addListener(eventName, listener)为指定事件注册一个监听器。
once(eventName, listener)为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。
removeListener(eventName, listener)off(eventName, listener)移除指定事件的某个监听器。
removeAllListeners([eventName])移除所有事件的所有监听器,如果指定事件,则移除指定事件的所有监听器。
setMaxListeners(n)默认情况下,EventEmitter如果添加的监听器超过10个就会输出警告信息。此方法用于提高监听器的默认限制的数量。
listenerCount(emitter, eventName)返回指定事件的监听器数量。这是一个静态方法。
emit(eventName, [arg1], [arg2], [...])触发指定事件,并传递任意数量的参数给监听器。

四、EventEmitter的实例属性

  • events:一个对象,存储了所有事件及其对应的监听器数组。

五、EventEmitter的实例方法

  • prependListener(eventName, listener):将监听器添加到指定事件监听器数组的开头。
  • prependOnceListener(eventName, listener):将一次性监听器添加到指定事件监听器数组的开头。
  • listeners(eventName):返回指定事件的监听器数组副本。
  • rawListeners(eventName):返回指定事件的监听器数组。

六、EventEmitter的注意事项

  1. 内存泄漏:忘记移除不再使用的监听器可能导致内存泄漏。使用once或在适当的时候调用removeListener可以避免这个问题。
  2. 错误处理:EventEmitter实例发生错误时,会触发名为error的特殊事件。为防止Node.js程序崩溃,建议始终为error事件注册监听器。

七、EventEmitter的示例代码

以下是一个使用EventEmitter实现简单的消息发布/订阅模式的示例:

const EventEmitter = require('events');

class PubSub extends EventEmitter {}

const pubsub = new PubSub();

// 订阅 'message' 事件
pubsub.on('message', (data) => {
  console.log(`接收到消息: ${data}`);
});

// 发布一条消息
setTimeout(() => {
  pubsub.emit('message', 'Hello, this is a message!');
}, 2000);

console.log('等待消息...');

在这个示例中,我们创建了一个自定义的EventEmitter类PubSub,并实例化了一个对象pubsub。然后,我们注册了一个名为message的自定义事件的监听器。当该事件触发时,回调函数将会被执行,并打印出接收到的消息。

八、EventEmitter的应用场景

EventEmitter在Node.js中有着广泛的应用场景,包括但不限于:

  • 事件通信:在Node.js应用程序的不同部分之间进行事件通信。
  • 异步操作:处理异步操作完成时的事件。
  • 模块扩展:为自定义模块添加事件支持,以便其他模块可以监听和触发这些事件。

九、EventEmitter的调试和优化

使用Node.js的内置模块如consoleprocess来监控和调试EventEmitter的性能。确保应用程序的稳定性和效率。同时,根据应用程序的具体需求,可以对EventEmitter进行优化,例如减少不必要的事件监听器、合理使用once方法等。

总之,EventEmitter是Node.js事件驱动编程的核心组件之一。通过掌握EventEmitter的使用方法和技巧,开发者可以更加高效地编写异步代码和构建可扩展、松耦合的Node.js应用。


http://www.kler.cn/a/379367.html

相关文章:

  • (七)JavaWeb后端开发——Maven
  • 【解决办法】无法使用右键“通过VSCode打开文件夹”
  • 『YOLO』| 断点训练、解决训练中断异常情况
  • el-table 滚动条重置 手动控制滚动条
  • 华为鸿蒙应用开发
  • 嵌入式——了解stm32
  • 《Java 实现希尔排序:原理剖析与代码详解》
  • 三维测量与建模笔记 - 2.2 射影几何
  • Hive数据库操作语法
  • Java-I/O框架10:File类、文件操作
  • docker部署Flask+Vue3项目
  • Leetcode328奇偶链表,Leetcode21合并两个有序链表,Leetcode206反转链表 三者综合题
  • C++游戏开发前景讨论
  • [算法初阶]第二集 滑动窗口(已完结)
  • 【NCRE】全国计算机一级必刷选择题(真题476道)
  • 第三十三章 Vue路由进阶路由模块封装
  • 【LeetCode:153. 寻找旋转排序数组中的最小值 + 二分】
  • sql将查到的所有id,拼接成字符串,用逗号隔开,并排序
  • 路由器中怎麼設置代理IP?
  • 微服务设计模式 - 发布订阅模式(Publisher Subscriber Pattern)
  • [java][高级]FilterListenerAjax
  • 同舟化工:实现LTC全流程数字化管控,赋能销售,提升运营效率
  • 基于springboot的Java学习论坛平台
  • 计算机系统架构
  • 【Python单元测试】pytest框架单元测试 配置 命令行操作 测试报告 覆盖率
  • Java项目管理与SSM框架介绍