- function pubsub(){
- var topic={};
- // key1:key2:key3
- function on(key,fn){
- var keys=key.split(":");
- if(keys.length!=1){
- each(keys,function(t){
- on(t,fn);
- });
- return;
- }
- (topic[key]=topic[key]||[]).push(fn);
- }
- function one(key,fn){
- fn._one_=true;
- on(key,fn);
- }
- //key1:key2:key3
- function off(key,fn){
- var keys=key.split(":");
- if(keys.length!=1){
- each(keys,function(t){
- off(t,fn);
- });
- return;
- }
- if(fn==null)topic[key]=null;
- else for(var arr=topic[key],l=arr.length-1,t;l>=0;l--){
- t=arr[l];
- if(fn==t)arr.splice(l,1);
- }
- }
- function emit(key){
- var keys=key.split(":");
- if(keys.length!=1){
- each(keys,function(t){
- emit(t);
- });
- return;
- }
- var args=[].slice.call(arguments, 0);
- if(topic[key]==null)return;
- for(var arr=topic[key],i=0,l=arr.length,t;i<l;i++){
- t=arr[i];
- t.apply(null,args.slice(1));
- if(t._one_){
- arr.splice(i,1);
- i--;
- l--;
- }
- }
- }
- return {
- one:one,
- on:on,
- off:off,
- emit:emit
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/2204201512363.html
来源: http://www.codesnippet.cn/detail/2204201512363.html