发布订阅模式

  • A+
所属分类:Web前端

发布订阅模式

简单的发布订阅

// 发布者 let Release = function (){   let listenerList = [];    this.add = function (fn){     listenerList.push(fn)   }    this.tigger = function(){     listenerList.forEach((item) => {       item();     })   } }  let rel = new Release(); rel.add(function(){   console.log("这个监听了很久了") });  rel.tigger(); 

通用的发布订阅

var Event = (function(){   let clientList = {},       tigger,       listen,       remove;    listen = function(key, fn){      if(!clientList[key]){        clientList[key] = [];      }       clientList[key].push(fn);   }      tigger = function(){     let key  = Array.prototype.shift.apply(arguments);     if(clientList[key] && clientList[key].length > 0){       clientList[key].forEach(item => {          item.apply(this, arguments)       })     }   }    remove = function(key, fn){     if(clientList[key] && clientList[key].length > 0){        for (let index = 0; index < clientList[key].length; index++) {         const item = clientList[key][index];         if(item === fn){           clientList[key].splice(index, 1);         }       }     }   }    return {     tigger,     listen,     remove   } }())  let like = function(){   console.log("这个是我爱吃的东西") } let love = function(){   console.log("这个是我最爱的人") }  let activity = function () {   console.log("这个是一个莫名其妙的活动") }  Event.listen("test", like) Event.listen("test", love) Event.listen("ac", activity)   // 触发test部分的内容 console.log("触发test部分的内容")  Event.tigger("test");   // 触发ac部分的内容 console.log("触发ac部分的内容")  Event.tigger("ac");   console.log("移除test的like内容") Event.remove("test", like);  console.log("继续触发test的内容") Event.tigger("test") 

不同的区域通讯

let a = (function(){    let count = 0;   let btnElement = document.getElementById("ObserverBtn");   btnElement.onclick = function(){     Event.tigger("clickTest", count++)   }; })()  let b = (function(){     let showElement = document.getElementById("show");    Event.listen("clickTest", function(val){      showElement.innerText = val;   }) })()