当前位置:首页 > JavaScript

js 实现 eventbus

2026-04-07 03:04:17JavaScript

实现 EventBus 的基本结构

EventBus 是一种发布-订阅模式的核心实现,用于组件或模块间的通信。以下是 JavaScript 中实现 EventBus 的核心代码框架:

class EventBus {
  constructor() {
    this.events = {};
  }
}

订阅事件(on 方法)

通过 on 方法订阅事件,将回调函数存储在事件对应的数组中:

on(eventName, callback) {
  if (!this.events[eventName]) {
    this.events[eventName] = [];
  }
  this.events[eventName].push(callback);
}

发布事件(emit 方法)

通过 emit 方法触发事件,执行所有订阅的回调函数:

js 实现 eventbus

emit(eventName, ...args) {
  const callbacks = this.events[eventName];
  if (callbacks) {
    callbacks.forEach(callback => {
      callback(...args);
    });
  }
}

取消订阅(off 方法)

通过 off 方法移除指定事件的回调函数:

off(eventName, callback) {
  const callbacks = this.events[eventName];
  if (callbacks) {
    this.events[eventName] = callbacks.filter(cb => cb !== callback);
  }
}

一次性订阅(once 方法)

通过 once 方法实现仅触发一次的事件订阅:

js 实现 eventbus

once(eventName, callback) {
  const wrapper = (...args) => {
    callback(...args);
    this.off(eventName, wrapper);
  };
  this.on(eventName, wrapper);
}

完整代码示例

整合上述方法后的完整 EventBus 实现:

class EventBus {
  constructor() {
    this.events = {};
  }

  on(eventName, callback) {
    if (!this.events[eventName]) {
      this.events[eventName] = [];
    }
    this.events[eventName].push(callback);
  }

  emit(eventName, ...args) {
    const callbacks = this.events[eventName];
    if (callbacks) {
      callbacks.forEach(callback => {
        callback(...args);
      });
    }
  }

  off(eventName, callback) {
    const callbacks = this.events[eventName];
    if (callbacks) {
      this.events[eventName] = callbacks.filter(cb => cb !== callback);
    }
  }

  once(eventName, callback) {
    const wrapper = (...args) => {
      callback(...args);
      this.off(eventName, wrapper);
    };
    this.on(eventName, wrapper);
  }
}

使用示例

以下是如何使用 EventBus 的简单示例:

const bus = new EventBus();

// 订阅事件
bus.on('message', (text) => {
  console.log(`Received: ${text}`);
});

// 发布事件
bus.emit('message', 'Hello EventBus!');

// 一次性订阅
bus.once('alert', (text) => {
  console.log(`Alert: ${text}`);
});

bus.emit('alert', 'This will only fire once.');
bus.emit('alert', 'This will not fire.');

注意事项

  • 事件名建议使用字符串常量,避免硬编码。
  • 在大型应用中,需注意内存泄漏问题,及时调用 off 清理无用订阅。
  • 可通过扩展支持异步事件或优先级机制增强功能。

标签: jseventbus
分享给朋友:

相关文章

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inpu…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

vue中eventbus实现

vue中eventbus实现

Vue 中 EventBus 的实现 EventBus 是一种跨组件通信的机制,适用于非父子关系的组件间传递数据。以下是具体实现方法: 创建 EventBus 新建一个独立的 Vue 实例作为事件中…