Skip to content

如何在JS中实现一个发布订阅


在 JavaScript 中,实现一个发布-订阅(Pub/Sub)模式可以通过创建一个类,维护事件与回调函数的映射关系。下面是一个简洁且实用的实现:

✅ 简单版本(基础实现)

javascript
class PubSub {
  constructor() {
    this.events = {};
  }

  // 订阅
  subscribe(event, callback) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(callback);
  }

  // 发布
  publish(event, data) {
    const callbacks = this.events[event];
    if (callbacks && callbacks.length) {
      callbacks.forEach(cb => cb(data));
    }
  }

  // 取消订阅
  unsubscribe(event, callback) {
    if (!this.events[event]) return;
    this.events[event] = this.events[event].filter(cb => cb !== callback);
  }
}

✅ 使用示例

javascript
const pubsub = new PubSub();

function callbackA(data) {
  console.log('Callback A received:', data);
}

function callbackB(data) {
  console.log('Callback B received:', data);
}

// 订阅事件
pubsub.subscribe('update', callbackA);
pubsub.subscribe('update', callbackB);

// 发布事件
pubsub.publish('update', { msg: '数据更新了!' });

// 取消订阅
pubsub.unsubscribe('update', callbackB);

// 再次发布
pubsub.publish('update', { msg: '再次更新,只触发 A' });

🔍 输出结果

javascript
Callback A received: { msg: '数据更新了!' }
Callback B received: { msg: '数据更新了!' }
Callback A received: { msg: '再次更新,只触发 A' }