手写一个简单的观察者

push主动触发

class Observer {
  constructor() {
    this.observers = {}
  }

  add(type, func) {
  	if( !this.observers[type] ) this.observers[type] = [] 
    this.observers[type].push(func)
  }

  removeObserver(type, fn) {
    const fns = this.observers[ type ];
    if(!fns) throw new Error('没有找到要删除的观察者');
    if(!fn) {
      fns && fns.length = 0;
    } else {
		let _fns = fns.filter( item => {
			return item !== fn
		})
		fns = _fns
    }
  }

  emit(type, data) {
    try {
      this.observers[type].forEach( func => func(data) )
    } catch (error) {
      throw new Error("未找到观察者")
    }
  }

}

const obs = new Observer()

const func1 = (message) => {
  console.log("我是:" + message);
}

const func2 = (message) => {
  console.log("你是:" + message);
}

obs.add("what",func1)
obs.add("what",func2)

obs.emit("what","猪")

pull 自行触发get方法

class Observer {
  constructor() {
    this.message = null,
    this.observers = {}
  }
  add(type, func) {
    if (this.observers[type]) return this.observers[type].push(func)
    this.observers[type] = [] 
    return this.observers[type].push(func)
  }

  removeObserver(type) {
    const index = this.observers.indexOf(type);
    if(index >= 0) {
      this.observers.splice(index, 1);
    } else {
      throw new Error('没有找到要删除的观察者');
    }
  }

  emit(type, msg) {
    this.message = msg
    this.observers[type].forEach( func => func())
  }

  getMsg() {
    return this.message
  }


}


const obs = new Observer()
const func = () => {
  console.log(123);
  const message = obs.getMsg();
  console.log('我收到了信息:' + message);
}

obs.add("get",func);

obs.emit("get", '这条信息需要你自己pull')

参考文献

手写JS(五)–实现观察者模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaxLoongLvs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值