背景
在业务开发中,经常会遇到要处理跨页面通信的问题,比如说用户打开了一个网站,网站的某些页面需要根据用户的登录的状态不同,显示不同的数据。显然这需要我们在登录成功的那一刻,
去通知到那些需要改变的页面。为了解决类似这样的问题,发布订阅模式诞生了。
思路
一个简单的发布订阅模式需要事件的绑定和触发是互相隔离的,同时支持动态的添加和删除事件。基于此就有了一个思路:
- 定义一个变量存储这些事件
- 定义一个监听方法,用于把事件添加到事件变量中
- 定义一个删除方法,用于把是事件从变量中移除
- 定义一个触发方法,用于调用变量中的事件
根据上面的思路,大致可以知道使用方式类似下面:
var emitter = new EventEmitter();
var handle = function (data) {
console.log(data)
}// 页面A订阅LOGIN事件
emitter.on('LOGIN', handle)// 登录成功,触发发布
emitter.emit('LOGIN', {user: { name: 'Jan', age: 18}})
【如何实现一个简单的发布订阅模式】具体代码实现
function EventEmitter() {
// 事件变量
this._event = {}
}// 添加订阅
EventEmitter.prototype.on= function (type, handle) {
this._event[type] = this._event[type] || []this._event[type].push(handle)
}// 移除订阅
EventEmitter.prototype.remove = function (type, handle) {
var index = (this._event[type] || []).indexOf(handle)if(index !== -1) {
this._event[type].splice(index, 1)
}
}// 触发发布
EventEmitter.prototype.emit = function (type, data) {
(this._event[type] || []).forEach(function (handle) {
handle(data)
})
}
如何实现一个简单的发布订阅模式首发于聚享小站,如果对您有帮助,不要忘记点赞支持一下呦
推荐阅读
- 选择篇(041)-下面代码的输出是什么?
- 首屏时间,你说你优化了,那你倒是计算出给给我看啊!
- 选择篇(021)-下面代码的输出是什么?
- 精读《zustand 源码》
- 浅谈js的垃圾回收机制
- 选择篇(017)-哪个选项是不正确的?
- JavaScript笔记之如何写好JavaScript
- 拉新×23,盈利可能性高出19倍,嵌入式分析到底有多香
- 厉害了,JavaScript 新提案(array.groupBy())