当前位置:首页 > JavaScript

js 实现eventbus

2026-04-06 14:55:47JavaScript

实现 EventBus 的基本结构

EventBus 是一种发布/订阅模式,用于组件或模块间的通信。以下是一个简单的 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);
    }
  }
}

使用示例

const bus = new EventBus();

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

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

// 取消订阅
const handler = (text) => console.log(`Handler: ${text}`);
bus.on('message', handler);
bus.off('message', handler);

支持一次性事件

可以扩展 EventBus 以支持一次性事件监听:

js 实现eventbus

class EventBus {
  // ... 其他方法同上

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

支持异步事件

如果需要异步触发事件,可以使用 PromisesetTimeout

js 实现eventbus

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

错误处理

为事件回调添加错误处理逻辑:

emit(eventName, ...args) {
  const callbacks = this.events[eventName];
  if (callbacks) {
    callbacks.forEach(callback => {
      try {
        callback(...args);
      } catch (error) {
        console.error(`Event "${eventName}" error:`, error);
      }
    });
  }
}

支持命名空间

为事件添加命名空间支持,避免事件名冲突:

on(namespace, eventName, callback) {
  const fullEventName = `${namespace}:${eventName}`;
  this.on(fullEventName, callback);
}

emit(namespace, eventName, ...args) {
  const fullEventName = `${namespace}:${eventName}`;
  this.emit(fullEventName, ...args);
}

注意事项

  • 避免内存泄漏,及时取消不再需要的事件监听
  • 事件名最好使用常量或枚举管理,避免拼写错误
  • 在大型应用中考虑使用现有的库如 mittEventEmitter3

标签: jseventbus
分享给朋友:

相关文章

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现选题

js实现选题

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

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…