当前位置:首页 > JavaScript

js简单实现订阅事件

2026-04-04 20:00:30JavaScript

实现订阅事件的基本模式

使用自定义事件和回调函数列表来管理订阅者:

class EventEmitter {
  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(cb => cb(...args));
    }
  }

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

使用示例

创建事件发射器实例并订阅事件:

js简单实现订阅事件

const emitter = new EventEmitter();

function handleData(data) {
  console.log('Received:', data);
}

emitter.on('data', handleData);
emitter.emit('data', { value: 123 });  // 输出: Received: {value: 123}
emitter.off('data', handleData);

浏览器环境实现

利用DOM的EventTarget接口实现:

js简单实现订阅事件

const eventTarget = new EventTarget();

function handleClick(e) {
  console.log('Event triggered:', e.detail);
}

eventTarget.addEventListener('customClick', handleClick);
eventTarget.dispatchEvent(new CustomEvent('customClick', {
  detail: { x: 10, y: 20 }
}));
eventTarget.removeEventListener('customClick', handleClick);

基于Promise的订阅

实现一次性事件订阅:

function once(eventEmitter, eventName) {
  return new Promise(resolve => {
    const handler = (...args) => {
      eventEmitter.off(eventName, handler);
      resolve(args);
    };
    eventEmitter.on(eventName, handler);
  });
}

// 使用方式
once(emitter, 'data').then(data => {
  console.log('One-time event:', data);
});

支持异步事件的变体

处理异步事件回调:

class AsyncEventEmitter extends EventEmitter {
  async emitAsync(eventName, ...args) {
    const callbacks = this.events[eventName] || [];
    for (const cb of callbacks) {
      await cb(...args);
    }
  }
}

每种实现方式适用于不同场景,基础版EventEmitter适合大多数简单用例,DOM EventTarget适用于浏览器环境,Promise版本适合需要等待单次事件触发的场景。

标签: 事件简单
分享给朋友:

相关文章

vue实现长按事件

vue实现长按事件

实现长按事件的几种方法 在Vue中实现长按事件可以通过多种方式完成,以下是几种常见的实现方法: 使用原生事件监听 通过@mousedown和@mouseup或@touchstart和@touchen…

vue实现点击事件

vue实现点击事件

Vue 中实现点击事件的方法 在 Vue 中可以通过 v-on 指令或简写 @ 来绑定点击事件。以下是几种常见的实现方式: 直接在模板中绑定方法 <template> <but…

vue 实现事件委托

vue 实现事件委托

Vue 中实现事件委托的方法 事件委托是一种通过将事件监听器绑定到父元素而非子元素的技术,利用事件冒泡机制统一处理子元素的事件。Vue 中可以通过以下方式实现: 1. 使用 v-on 和事件修饰符…

vue事件循环实现

vue事件循环实现

Vue 的事件循环实现 Vue 的事件循环机制主要依赖于 JavaScript 的原生事件循环(Event Loop),并结合 Vue 自身的响应式系统和异步更新队列机制。以下是 Vue 事件循环的核…

vue实现页面单击事件

vue实现页面单击事件

Vue 实现页面单击事件的方法 在 Vue 中实现单击事件可以通过 v-on 指令或 @ 简写来完成。以下是几种常见的实现方式: 使用 v-on 指令绑定单击事件 通过 v-on:click 可以直…

vue实现人工点击事件

vue实现人工点击事件

Vue 中实现人工点击事件的方法 在 Vue 中可以通过多种方式触发点击事件,以下是几种常见的实现方法: 使用 v-on 或 @ 指令绑定原生事件 通过模板语法直接绑定原生 click 事件: &…