当前位置:首页 > JavaScript

js实现bus

2026-03-14 23:49:01JavaScript

JavaScript 实现事件总线(Bus)

事件总线(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) {
    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', (data) => {
  console.log('Received:', data);
});

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

// 取消订阅
const handler = (data) => console.log('Handler:', data);
bus.on('log', handler);
bus.off('log', handler);

高级功能扩展

  1. 一次性监听
once(eventName, callback) {
  const wrapper = (...args) => {
    callback(...args);
    this.off(eventName, wrapper);
  };
  this.on(eventName, wrapper);
}
  1. 异步事件支持
async emitAsync(eventName, ...args) {
  const callbacks = this.events[eventName];
  if (callbacks) {
    await Promise.all(callbacks.map(cb => cb(...args)));
  }
}
  1. 错误处理增强
emit(eventName, ...args) {
  try {
    const callbacks = this.events[eventName];
    if (callbacks) {
      callbacks.forEach(callback => {
        try {
          callback(...args);
        } catch (err) {
          console.error(`Event ${eventName} handler error:`, err);
        }
      });
    }
  } catch (err) {
    console.error(`Event emit error:`, err);
  }
}

Vue 中的事件总线

在 Vue 2 中常这样使用:

// 创建总线
export const bus = new Vue();

// 组件A发送事件
bus.$emit('event-name', payload);

// 组件B接收事件
bus.$on('event-name', payload => {
  // 处理逻辑
});

注意事项

js实现bus

  • 避免内存泄漏,及时取消不再需要的事件监听
  • 大型项目建议使用专业状态管理工具(Vuex/Pinia等)
  • 事件命名建议采用常量管理,避免拼写错误

标签: jsbus
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

jquery js

jquery js

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

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…