当前位置:首页 > 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 以支持一次性事件监听:

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

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

支持异步事件

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

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);
      }
    });
  }
}

支持命名空间

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

js 实现eventbus

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实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现的游戏

js实现的游戏

JavaScript 游戏开发基础 JavaScript 是开发网页游戏的流行选择,因其无需插件即可在浏览器中运行。以下是一些关键技术和资源: HTML5 Canvas Canvas 提供了绘制图形…

js 实现图片 放大

js 实现图片 放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性可以实现图片的平滑放大效果。结合 JavaScript 监听鼠标事件控制放大状态: con…

js实现排序

js实现排序

数组排序方法 JavaScript提供了内置的sort()方法用于数组排序。默认情况下,sort()将元素转换为字符串并按照Unicode码点排序。对于数字排序,需传入比较函数。 const num…

js实现图片移动

js实现图片移动

使用CSS和JavaScript实现图片移动 方法一:使用CSS动画结合JavaScript控制 通过CSS定义动画关键帧,JavaScript动态添加或移除动画类。 /* CSS部分 */ .m…