js - 发布订阅者模式

var eventCenter = {
    sub: function(name, callback) {
      this.argus = this.argus || {};//已经有事件用已经有的this.argus
      this.argus[name] = this.argus[name] || [];
      this.argus[name].push(callback);//对应添加的事件名已经有了就在加到该事件的数组中
    },
    pub: function(name, obj) {
      var args = Array.prototype.slice.call(arguments, 0);//arguments(Object)是传入的参数这里取到第一个;也可以直接通过函数传入参数的形式
      var name = args.shift();
      if (!this.argus || !this.argus[name]) {//没有传入参数就不往下执行
        return this;
      }
      for (var i = 0; i < this.argus[name].length; i++) {
        this.argus[name][i].apply(this, args);//触发订阅事件的回调事件,apply(this, args)是为了拿到传入的参数;this.argus[name][i](args)也可以实现
      }
    }
};

export default eventCenter;



// 订阅事件
eventCenter.sub("a", function(res) {//添加事件
    console.log(12345678,res)
});



// 发布事件
eventCenter.pub("a", {name: 1});//触发订阅事件发送参数

总结: 

eventCenter 可以在不同模块之间共享。A 模块发布事件, B 模块订阅
posted @ 2020-06-08 15:37  monkey-K  阅读(245)  评论(0编辑  收藏  举报