当前位置:首页 > JavaScript

js 实现 eventbus

2026-03-15 09:34:35JavaScript

实现 EventBus 的基本结构

EventBus 是一种发布/订阅模式,用于组件或模块间的通信。以下是一个简单的 EventBus 实现:

js 实现 eventbus

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

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

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

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

使用示例

const eventBus = new EventBus();

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

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

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

支持一次性事件监听

可以通过扩展 on 方法或添加 once 方法实现一次性事件监听:

js 实现 eventbus

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

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

// 使用示例
eventBus.once('greet', (name) => {
  console.log(`Hello ${name}, this will only run once!`);
});

eventBus.emit('greet', 'Alice'); // 触发
eventBus.emit('greet', 'Bob');   // 不触发

支持异步事件处理

可以通过 Promise 或 async/await 支持异步事件处理:

class AsyncEventBus extends EventBus {
  async emitAsync(eventName, ...args) {
    if (this.events[eventName]) {
      for (const callback of this.events[eventName]) {
        await callback(...args);
      }
    }
  }
}

// 使用示例
const asyncBus = new AsyncEventBus();
asyncBus.on('asyncEvent', async (data) => {
  await new Promise(resolve => setTimeout(resolve, 1000));
  console.log('Async processed:', data);
});

asyncBus.emitAsync('asyncEvent', 'Test Data');

支持事件优先级

可以通过扩展数据结构支持事件优先级:

class PriorityEventBus extends EventBus {
  on(eventName, callback, priority = 0) {
    if (!this.events[eventName]) {
      this.events[eventName] = [];
    }
    this.events[eventName].push({ callback, priority });
    this.events[eventName].sort((a, b) => b.priority - a.priority);
  }

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

// 使用示例
const priorityBus = new PriorityEventBus();
priorityBus.on('priorityEvent', () => console.log('Default Priority'), 0);
priorityBus.on('priorityEvent', () => console.log('High Priority'), 10);
priorityBus.emit('priorityEvent');

标签: jseventbus
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js树实现

js树实现

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

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码 funct…