一个简单的pub-sub.js

pub-sub也就是发布订阅的模式是我们比较常用的设计模式,它一种一对多的依赖关系,在收到相应的消息之后会更新订阅该消息的所有事件。今天在写项目时候正好用到了,就写了一个简版的。

  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 节省内存
        delete this.handlers[key]
      } else {
        this.handlers[key].splice(index, 1)
      }
    }
    // 触发
    walk(key) {
      // 取出参数并转化为数组
      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')
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,347评论 19 139
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,120评论 2 89
  • 上周五,TT从德国空降北京,这次他是途经北京,只待两天,然后去泰国打高尔夫。照例,我们以前的同事和他一起聚餐。 说...
    惠茹姐姐阅读 2,394评论 4 2
  • 最近结识了很多新朋友,基本都是弱链接的朋友,在和这些新朋友交流和聊天时收获了很多的感悟! 发现...
    大道無门阅读 1,560评论 0 1
  • 从前有一只猫妖,它对于其它的猫妖很特别,因为别的猫一生下来就有九条尾巴,而它却只有八条尾巴,于是别人都叫它八尾猫,...
    七月微光阅读 4,576评论 0 0