当前位置:首页 > JavaScript

js 实现eventbus

2026-02-01 21:54:15JavaScript

实现 EventBus 的基本结构

EventBus 是一种发布/订阅模式,允许组件间通过事件通信。以下是核心功能实现:

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

订阅事件(on 方法)

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

js 实现eventbus

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 方法实现只触发一次的事件订阅:

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

完整实现代码

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

使用示例

const bus = new EventBus();

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

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

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

// 只会触发一次
bus.emit('alert', 'First');
bus.emit('alert', 'Second');

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

功能扩展建议

  1. 错误处理:在 emit 方法中添加 try-catch 包裹回调执行
  2. 异步支持:使用 Promise 或 async/await 处理异步回调
  3. 事件命名空间:支持类似 'namespace:event' 的事件命名方式
  4. 优先级系统:为回调函数添加优先级参数

该实现提供了 EventBus 的核心功能,可根据实际需求进行扩展和完善。

标签: jseventbus
分享给朋友:

相关文章

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…