发布订阅

224 阅读1分钟

发布订阅


class EventEmitter{  // redux promise
  constructor(){
    this._events = {}
    this.defaultMaxListeners = 10;
  }

  on(eventName, callback) {
    debugger
    if (!this._events) {
      this._events = {}
    }

    if (this._events[eventName]) {
      this._events[eventName].push(callback)
    }else{
      this._events[eventName] = [].concat(callback)
    }
    
  }
  emit(eventName) {
    debugger
    let args = Array.prototype.slice.call(arguments)
    args.shift()
    if (this._events[eventName]) {
      this._events[eventName].forEach(cb => cb.apply(null,args));
    }
  }
  removeListener(eventName,callback) {
    debugger
    if (this._events[eventName]) {
      this._events = this._events.filter(fn=>{
        return fn !== callback
      })
      // delete this._events[eventName]
    }
  }
  addEventListener(eventName,callback) {
    debugger
    this.on(eventName,callback)
  }

  removeAllListener(){
    this._events = {}
  }
}

let e = new EventEmitter()

e.on('11111',(data)=>{
  debugger
  console.log('data',data)
  console.log('on')
})
e.on('22222',(data)=>{
  debugger
  console.log('data',data)
  console.log('on')
})

console.log('1')


e.emit('11111','data11','data111')
e.emit('22222','data22','data222')

观察者与被观察者

class Subject{  // redux promise
  constructor(){
    debugger
    this.name = name
    this.observers = [] // 被观察者要存放在观察者中
    this.state = '心情很好'
  }
  // 提供一个接受观察者的方法
  attach(observer) {
    debugger
    this.observers.push(observer)// 存放观察者
  }
  // 改变被观察者的状态并通知观察者
  setState(newState) {
    debugger
    this.state = newState
    this.observers.forEach(o => o.update(newState));
  }
}

class Observer{  
  constructor(name){
    debugger
    this.name = name
  }
  // 通知转态
  update(newState) {
    debugger
    console.log(" Observer ~ update ~ newState", this.name,newState)
  }
}


let e = new Subject('小宝宝')
let o1 = new Observer('妈妈')
let o2= new Observer('爸爸')
e.attach(o1)
e.attach(o2)

e.setState('------')

发布订阅

// 发布 ---》中间代理《--订阅
//  观察者模式 发布订阅
class Events{  // redux promise
  constructor(){
    this.callbacks = []
    this.results = []
  }
  on(callback) {
    debugger
    this.callbacks.push(callback)
  }
  emit(data) {
    debugger
    this.results.push(data)
    this.callbacks.forEach(cb => cb(this.results));
  }

}

let e = new Events()

e.on((data)=>{
  debugger
  console.log('data',data)
  console.log('on')
})

console.log('1')


e.emit('11111')