ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 实现思路: 1. 创建一个对象 2. 对象上有一个调度中心 list,用来存储触发时的回调函数 3. on 函数用来把回调函数 fn 存储在 list 中 4. emit 触发函数取出 list 中的对应的函数并执行 实现代码: ``` let eventEmitter = {} eventEmitter.list = {} eventEmitter.on = function (event, fn) { const _this = this if (_this.list[event]) { _this.list[event].push(fn) } else { _this.list[event] = [fn] } return this } eventEmitter.emit = function () { const _this = this let event = [].shift.call(arguments), fns = [..._this.list[event]]; if (!fns || fns.length === 0) { return false; } fns.forEach(fn => { fn.apply(_this, arguments) }) return _this } function user1 (content) { console.log('用户1订阅了:', content); }; function user2 (content) { console.log('用户2订阅了:', content); }; eventEmitter.on('article', user1); eventEmitter.on('article', user2); eventEmitter.emit('article', 'Javascript 发布-订阅模式'); ``` ## 发布订阅和观察者模式的区别 ![](https://img.kancloud.cn/d7/38/d738cd5de771aa531b4ccd69c9e0b9f8_512x406.png) **观察者模式**:观察者(Observer)直接订阅(Subscribe)主题(Subject),而当主题被激活的时候,会触发(Fire Event)观察者里的事件。 **发布订阅模式**:订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Event Channel),当发布者(Publisher)发布该事件(Publish Event)到调度中心,也就是该事件触发时,由调度中心统一调度(Fire Event)订阅者注册到调度中心的处理代码。 **差异**: * 观察者模式只有两个,一个是观察者一个是被观察者。发布订阅模式不一样,发布订阅模式还有一个中间层,发布订阅模式的实现是,发布者通知给中间层 => 中层接受并通知订阅者 => 订阅者收到通知并发生变化