消息订阅与发布"/>
简单实现消息订阅与发布
在发布/订阅模式中,你可以想象存在一个消息中心的地方,你可以在那里“注册一条消息”,那么被注册的这条消息可以被感兴趣的若干人“订阅”,一旦未来这条“消息被发布”,则所有订阅了这条消息的人都会得到提醒。
这个就是发布/订阅模式的设计思路。接下来我们一点一点实现一个简单的发布/订阅模式。
//先实现一个消息中心的构造函数(类),用来创建一个消息中心
function MessageCenter(){var _messages = {}; // 所有注册的消息都存在这里this.register= function(){}; // 用来注册消息的方法this.subscribe = function(){}; // 用来订阅消息的方法this.publish= function(){}; // 用来发布消息的方法
}
消息中心的搭建好了 接下来完善 register 、subscribe 、publish这三个方法就好了
// register方法负责注册消息,接收一个注册消息的类型 比如'娱乐'类型消息this.register= function(msgType){// 判断是否重复注册if(typeof _messages[msgType] === 'undefined'){_messages[msgType] = []; // 数组中会存放订阅者}else{console.log('这个消息已经注册过了');}}// subscribe方法,需要订阅者和已经注册了的消息进行绑定// 由于订阅者得到消息后需要处理消息,所以他(subFn)是一个个的函数this.subscribe = function(msgType, subFn){// 判断是否有这个消息if(typeof _messages[msgType] !== 'undefined'){_messages[msgType].push(subFn); //订阅 }else{console.log('这个消息还没注册过,无法订阅')}}// publish方法,发布某条消息,并通知订阅这条消息的所有订阅者函数this.publish= function(msgType, args){ // msgType是消息类型,args是这条消息的附加信息// 发布消息时,判断下有没有这条消息if(typeof _messages[msgType] === 'undefined') {console.log('没有这条消息,无法发布');}var events = {type: msgType,args: args || {}};_messages[msgType].forEach( sub => sub(events) )}
}
这样,一个简单的发布/订阅模式就完成了,当然这只是这种模式的其中一种简单实现,还有很多其他的实现方式。
就此我们就可以用他来处理一些异步操作了。
var msgCenter = new MessageCenter();//注册消息 娱乐msgCenter.register('娱乐');// 订阅消息 娱乐msgCenter.subscribe ('娱乐', subscribeFn);function subscribeFn(events) {console.log(`${events.type}消息更新了`, events.args);} //发布setTimeout(function(){msgCenter.publish('娱乐', '喜洋洋与灰太狼正在热映');}, 1000);
更多推荐
简单实现消息订阅与发布
发布评论