发布订阅模式简介:订阅者(Subsciber)通过事件注册(Subscribe)将订阅事件提交到调度中心(Topic),调度中心保存好订阅者的注册信息(回调函数),每当发布者(Publisher)发布事件的时候,通过事件发布(Publish)将发布的消息提交到调度中心,然后调度中心统一处理订阅者注册该事件的消息(执行注册时的回调函数)。
show me the code:
//创建一个发布订阅模式
function Pubsub(){
//订阅中心,保存不同的订阅事件名称name
this.topics={}
//首先需要创建发布订阅事件主题,订阅者通过这个名称注册,发布者通过这个名称发布消息
this.topic=function(name){
!this.topics[name] && (this.topics[name] = [])
console.log("创建")
console.log(this.topics)
}
//订阅注册 订阅者调用此方法,传入订阅事件名
this.subscribe=function(name,callback){
if(!this.topics[name]){
console.log("无效的主题")
return
}
if(typeof callback !== "function"){
console.log("无效回调")
return
}
this.topics[name].push(callback)
console.log("sub")
console.log(this.topics)
}
//取消订阅 订阅者调用此方法,传入订阅事件名
this.unsubscribe=function(name,callback){
this.topics[name].forEach((item,idx)=>{
if(item == callback){
this.topics[name][idx]=null //注销订阅者的注册事件
}
})
console.log(this.topics)
}
//发布 执行订阅主题下各个订阅者者的注册内容
this.publish=function(name,params){
if(this.topics[name] && this.topics[name].length > 0){
this.topics[name].forEach((item,idx)=>{
item(params)
})
}
console.log(this.topics)
}
}
//实例化一个发布订阅模式,多个new,可以做到事件隔离,正常一个项目一个就够了
const pub1 = new Pubsub()
//调用 示例
pub1.topic("on-sleep) //创建一个睡觉的订阅主题
//同学1 订阅睡觉
pub1.subscribe("on-sleep",(a)=>{
console.log("sleep")
console.log(a)
})
//同学2 订阅睡觉 回调不同
pub1.subscribe("on-sleep",(a)=>{
console.log("sleep2”)
console.log(a)
})
setTimeout(()=>{
//时间差不多了,通知他们该睡觉了!
pub1.publish("on-sleep",{info:"该睡觉啦!"})
},2000)
更多思考: 手动实现发布订阅模式结合Object.defineProperty数据劫持,实现vue的双向绑定