Js实现订阅发布模式(让你的代码写得贼六)
2017-11-17 10:05
477 查看
简单例子
var salesoffice = {}; //定义售楼处 salesoffice.clientList = []; //缓存列表,存放订阅者的回调函数 salesoffice.listen = function (key,fn) { //增加订阅者 if(!this.clientList[key]){ this.clientList[key] = []; } this.clientList[key].push(fn); //订阅的消息添加进缓存列表 }; salesoffice.trigger = function () { //发布消息 var key = Array.prototype.shift.call(arguments); //取出消息类型 fns = this.clientList[key]; if(!fns || fns.length ===0 ){ //如果没有订阅改消息,则返回 return false; } for (var i = 0,fn;fn=fns[i++];){ fn.apply(this,arguments); //arguments 是发布消息时带上的参数 } }; //测试例子 salesoffice.listen('squareMeter88',function (price) { //小明订阅消息 console.log("价格=" + price ); }); salesoffice.listen('squareMeter110',function (price) { //小红订阅消息 console.log("价格=" + price ); }); salesoffice.trigger('squareMeter88',2000000); salesoffice.trigger('squareMeter110',3000000);
通用实现
//通用实现 var event = { clientList:[], listen : function (key,fn) { if(!this.clientList[ key ]){ this.clientList[ key ] = []; } this.clientList[key].push(fn); }, trigger:function () { var key = Array.prototype.shift.call(arguments), fns = this.clientList[ key ]; if(!fns || fns.length===0){ return false; } for (var i=0,fn;fn = fns[i++];){ fn.apply(this,arguments); } } }; //在定义一个instalEvent 函数,这个函数可以给所有的对象都动态安装发布订阅模式 var installEvent = function (obj) { for (var i in event){ obj[i] = event[i]; } } var salesOffices = {}; installEvent(salesOffices); salesOffices.listen('squareMeter88',function (price) { //小明订阅消息 console.log("价格=" + price ); }); salesOffices.listen('squareMeter110',function (price) { //小红订阅消息 console.log("价格=" + price ); }); salesOffices.trigger('squareMeter88',2000000); salesOffices.trigger('squareMeter110',3000000); //取消订阅事件 event.remove = function (key,fn) { var fns = this.clientList[ key ]; if( !fns ){ //如果key对应的消息没有被人订阅,则直接返回 return false; } if( !fn ){ //如果传入的具体的回调函数,表示需要取消key对应消息的所有订阅 fns && (fns.length=0); }else{ for (var l = fns.length - 1;l >=0;l--){ var _fn = fns[l]; if(_fn === fn){ fns.splice(l,1); //删除订阅者的回调函数 } } } } var salesOffices = {}; installEvent(salesOffices); salesOffices.listen('squareMeter88',fn1 = function (price) { //小明订阅消息 console.log("价格=" + price ); }); salesOffices.listen('squareMeter110',fn2 = function (price) { //小红订阅消息 console.log("价格=" + price ); }); salesOffices.remove('squareMeter88',fn1); //删除小明的订阅 salesOffices.trigger('squareMeter110',2000000);
全局的发布–订阅对象
//全局的发布--订阅对象 var Event = (function () { var clientList = {}, listen, trigger, remove; listen = function (key,fn) { if(!clientList[key]){ clientList[key]=[]; } clientList[key].push(fn); }; trigger = function () { var key = Array.prototype.shift.call(arguments), fns = clientList[key]; if(!fns || fns.length===0){ return false; } for (var i =0,fn;fn=fns[i++];){ fn.apply(this,arguments); } }; remove = function (key,fn) { var fns = clientList[key]; if(!fns){ return false } if(!fn){ fns && (fns.length=0); }else{ for (var l=fns.length-1;l>=0;l--){ var _fn = fns[l]; if(_fn===fn){ fns.splice(l,1); } } } }; return { listen:listen, trigger:trigger, remove:remove, } })(); Event.listen('squareMeter88',function (price) { console.log("价额="+price); }); Event.trigger('squareMeter88',2000000);
相关文章推荐
- 学习笔记-js发布/订阅模式的简单实现
- js发布——订阅模式的通用实现及取消订阅
- js设计模式中发布与订阅实现观察者模式例子
- nodejs redis 发布订阅机制封装实现方法及实例代码
- 基于JS原生的事件订阅和发布模式代码
- 【出版直播】博客园征途系列,《设计模式——基于C#的工程化实现与扩展》电子书、示例代码发布,互动网预订开始
- 【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)
- Shuttle ESB(五)——发布订阅模式实例实现(2)
- JS实现模仿微博发布效果实例代码
- js事件编程的发布/订阅模式(一对一关系)
- 基于spring-redis发布订阅模式的实现
- Redis订阅&发布以及python代码实现
- Spring基于事件驱动模型的订阅发布模式代码实例详解
- MQTT协议之使用Future模式订阅及发布(使用fusesource mqtt-client实现)
- Node中EventEmitter以及如何实现JavaScript中的订阅/发布模式
- 利用zookeeper的发布/订阅模式实现配置动态变更
- js 发布订阅/观察者模式
- JS实现模仿微博发布效果实例代码
- JS发布订阅模式
- Spring基于事件驱动模型的订阅发布模式代码实例详解