一個簡單的pub-sub.js

pub-sub也就是發(fā)布訂閱的模式是我們比較常用的設(shè)計模式,它一種一對多的依賴關(guān)系,在收到相應(yīng)的消息之后會更新訂閱該消息的所有事件。今天在寫項目時候正好用到了,就寫了一個簡版的。

  class PubSub {
    constructor() {
      this.handlers = {}
    }
    // 訂閱
    on(key, handler) {
      if (!(key in this.handlers)) {
        this.handlers[key] = []
      }
      this.handlers[key].push(handler)
    }
    // 卸載
    off(key, handler) {
      const index = this.handlers[key].findIndex(item => {
        item === handler
      })
      // 不存在直接返回
      if (index < 0) {
        return
      }

      if (this.handlers[key].length === 1) {
        // 只有一個直接刪除key 節(jié)省內(nèi)存
        delete this.handlers[key]
      } else {
        this.handlers[key].splice(index, 1)
      }
    }
    // 觸發(fā)
    walk(key) {
      // 取出參數(shù)并轉(zhuǎn)化為數(shù)組
      const args = Array.prototype.slice.call(arguments, 1)
      this.handlers[key].forEach(handler => {
        // 防止this指向亂掉
        handler.apply(this, args)
      });
    }
  }

測試

  const pubSub = new PubSub()
  fn1 = function(val1, val2) {
    console.log(val1, val2) // hah hahah
  }
  fn2 = function(val1) {
    console.log(val1) // hah
  }
  pubSub.on('ms1', fn1)
  pubSub.on('ms1', fn2)
  pubSub.walk('ms1', 'hah', 'hahah')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,535評論 19 139
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,285評論 2 89
  • 上周五,TT從德國空降北京,這次他是途經(jīng)北京,只待兩天,然后去泰國打高爾夫。照例,我們以前的同事和他一起聚餐。 說...
    惠茹姐姐閱讀 351評論 4 2
  • 最近結(jié)識了很多新朋友,基本都是弱鏈接的朋友,在和這些新朋友交流和聊天時收獲了很多的感悟! 發(fā)現(xiàn)...
    大道無門閱讀 265評論 0 1
  • 從前有一只貓妖,它對于其它的貓妖很特別,因為別的貓一生下來就有九條尾巴,而它卻只有八條尾巴,于是別人都叫它八尾貓,...
    七月微光閱讀 1,071評論 0 0

友情鏈接更多精彩內(nèi)容