张静宜对订阅-发布模式的理解
2017-05-27 20:35
253 查看
var Event = (function(){ var global = this, Event, _default = 'default'; Event = function(){ var _listen, _trigger, _remove, _slice = Array.prototype.slice, _shift = Array.prototype.shift, _unshift = Array.prototype.unshift, namespaceCache = {}, _create, find, each = function( ary, fn ){ var ret; for ( var i = 0, l = ary.length; i < l; i++ ){ var n = ary[i]; ret = fn.call( n, i, n); } return ret; }; _listen = function( key, fn, cache ){ if ( !cache[ key ] ){ cache[ key ] = []; } cache[key].push( fn ); }; _remove = function( key, cache ,fn){ if ( cache[ key ] ){ if( fn ){ for( var i = cache[ key ].length; i >= 0; i-- ){ if( cache[ key ][i] === fn ){ cache[ key ].splice( i, 1 ); } } }else{ cache[ key ] = []; } } }; _trigger = function(){ var cache = _shift.call(arguments), key = _shift.call(arguments), args = arguments, _self = this, ret, stack = cache[ key ]; if ( !stack || !stack.length ){ return; } return each( stack, function(){ return this.apply( _self, args ); }); }; _create = function( namespace ){ var namespace = namespace || _default; var cache = {}, offlineStack = [], // 离线事件 ret = { listen: function( key, fn, last ){ _listen( key, fn, cache ); if ( offlineStack === null ){ return; } if ( last === 'last' ){ offlineStack.length && offlineStack.pop()(); }else{ each( offlineStack, function(){ this(); }); } offlineStack = null; }, one: function( key, fn, last ){ _remove( key, cache ); this.listen( key, fn ,last ); }, remove: function( key, fn ){ _remove( key, cache ,fn); }, trigger: function(){ var fn, args, _self = this; _unshift.call( arguments, cache ); args = arguments; fn = function(){ return _trigger.apply( _self, args ); }; if ( offlineStack ){ return offlineStack.push( fn ); } return fn(); } }; return namespace ? ( namespaceCache[ namespace ] ? namespaceCache[ namespace ] : namespaceCache[ namespace ] = ret ) : ret; }; return { create: _create, one: function( key,fn, last ){ var event = this.create( ); event.one( key,fn,last ); }, remove: function( key,fn ){ var event = this.create( ); event.remove( key,fn ); }, listen: function( key, fn, last ){ var event = this.create( ); event.listen( key, fn, last ); }, trigger: function(){ var event = this.create( ); event.trigger.apply( this, arguments ); } }; }(); return Event; })();
相关文章推荐
- 我理解的设计模式:观察者模式(订阅发布模式)
- 理解javascript的设计模式之发布订阅模式
- Javascript中理解发布--订阅模式
- 观察者模式(订阅与发布模式),史上最简单的观察者和被观察者理解;
- zeroMQ初体验-32.发布/订阅模式进阶-克隆模式-上
- zeroMQ初体验-33.发布/订阅模式进阶-克隆模式-中
- Dojo的订阅/发布模式
- 十六 设计模式之观察者模式(发布订阅模式)
- 观察者(发布订阅)模式 与 委托事件
- 小话设计模式三:发布/订阅模式
- zeroMQ初体验-31.发布/订阅模式进阶-黑盒的高速订阅者
- 观察者(发布订阅)模式 与 委托事件
- 发布-订阅模式[译自维基百科]
- jquery订阅发布模式
- JMS消息机制--发布-订阅模式
- zeroMQ初体验-34.发布/订阅模式进阶-克隆模式-下,结言
- 订阅发布模式
- 发布-订阅消息模式
- 观察者模式(也就是发布订阅模式)
- 委托的订阅发布模式