JavaScript 观察者 (发布/订阅) 模式

1. 定义#

观察者(发布/订阅)模式定义了对象之间一对多的依赖关系,当一个对象改变了状态,它的所有依赖会被通知,然后自动更新。

订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Event Channel),当发布者(Publisher)发布该事件(Publish Event)到调度中心,也就是该事件触发时,由调度中心统一调度(Fire Event)订阅者注册到调度中心的处理代码。

2. 如何实现?#

class EventEmitter {
constructor() {
this.listeners = {};
}
on(eventName, fn) {
this.listeners[eventName] = this.listeners[eventName] || [];
this.listeners[eventName].push(fn);
}
emit(eventName, ...args) {
const listeners = this.listeners[eventName];
listeners && listeners.forEach(lis => lis.apply(this, args));
}
once(eventName, fn) {
const _fn = (...args) => {
fn.apply(this, args);
this.remove(eventName, _fn);
}
this.on(eventName, _fn);
}
remove(eventName, fn) {
const listeners = this.listeners[eventName];
if (listeners) {
this.listeners[eventName] = listeners.filter(lis => lis != fn);
} else {
delete this.listeners[eventName];
}
}
}