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

面试之《实现Event Bus》

Event Bus(事件总线)是一种用于在应用程序不同组件之间进行解耦通信的设计模式。它允许组件之间通过发布和订阅事件来进行交互,而不需要直接依赖彼此。以下介绍使用 JavaScript 实现 Event Bus 的方法。

JavaScript 实现 Event Bus

class EventBus {
    constructor() {
        // 用于存储事件和对应的回调函数列表
        this.events = {};
    }

    // 订阅事件
    on(eventName, callback) {
        if (!this.events[eventName]) {
            // 如果事件不存在,则创建一个新的数组来存储回调函数
            this.events[eventName] = [];
        }
        // 将回调函数添加到对应事件的数组中
        this.events[eventName].push(callback);
    }

    // 发布事件
    emit(eventName, ...args) {
        if (this.events[eventName]) {
            // 遍历事件对应的回调函数列表并依次执行
            this.events[eventName].forEach(callback => {
                callback(...args);
            });
        }
    }

    // 取消订阅事件
    off(eventName, callback) {
        if (this.events[eventName]) {
            // 过滤掉指定的回调函数
            this.events[eventName] = this.events[eventName].filter(cb => cb!== callback);
        }
    }
}

// 使用示例
const eventBus = new EventBus();

// 定义一个回调函数
const callback = (message) => {
    console.log(`Received message: ${message}`);
};

// 订阅事件
eventBus.on('messageEvent', callback);

// 发布事件
eventBus.emit('messageEvent', 'Hello, Event Bus!');

// 取消订阅事件
eventBus.off('messageEvent', callback);

// 再次发布事件,此时回调函数不会被执行
eventBus.emit('messageEvent', 'This message won\'t be received.');

代码解释

1. 构造函数

在 JavaScript 的实现中,构造函数都会初始化一个空对象(JavaScript)或字典(Python)来存储事件和对应的回调函数列表。

2. on 方法

用于订阅事件。如果事件不存在,则创建一个新的数组(JavaScript)来存储回调函数,并将回调函数添加到该数组或列表中。

3. emit 方法

用于发布事件。如果事件存在,则遍历该事件对应的回调函数列表,并依次执行这些回调函数,同时传递相应的参数。

4. off 方法

用于取消订阅事件。通过过滤掉指定的回调函数,将其从事件对应的回调函数列表中移除。

通过以上实现,你可以在应用程序中使用 Event Bus 来实现组件之间的解耦通信。

相关文章:

  • 基于Spring Boot的牙科诊所管理系统的设计与实现(LW+源码+讲解)
  • Redis 部署方式有哪些
  • PDF Reader
  • LeNet-5卷积神经网络详解
  • 【python】如何判断是json数组还是字典
  • c++介绍线程的屏障 八
  • nnUNet V2修改网络——全配置替换MultiResBlock模块
  • 密码学笔记
  • springboot 自动装配原理
  • 用户模块——redis工具类
  • 04 | 初始化 fastgo 项目仓库
  • tcp/ip协议中网络层协议的主要特点,tcp/ip协议中网络层都有哪些协议?
  • c# 2025/3/12 周三
  • MyBatis 的核心配置文件是干什么的? 它的结构是怎样的? 哪些是必须配置的,哪些是可选的?
  • AI重构SEO关键词布局
  • TA学习之路——1.4 MVP矩阵运算
  • 安全左移动赋能:灵脉IAST交互式应用安全测试平台
  • Python的日志
  • HarmonyOS学习第19天:感知世界的 “超能力”,HarmonyOS 传感器揭秘
  • ChātGPT开发“SolidWorks工具箱”,可建海量3D模型库,能一键画图、批量赋属性、自动出图,效率提高10倍
  • 龙翔被撤销南京市人大常委会主任职务,此前已被查
  • 同日哑火丢冠,双骄的下山路,手牵手一起走
  • 五一假期上海口岸出入境客流总量预计达59.4万人,同比增约30%
  • 乌美签署矿产协议
  • 水利部将联合最高检开展黄河流域水生态保护专项行动
  • 辽宁辽阳市白塔区一饭店火灾事故举行新闻发布会,现场为遇难者默哀