发布者-订阅者模式、观察者模式、Promise.all实现

611 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

发布者-订阅者模式

//发布-订阅模式

class EventEmitter{
  constructor(){
    this.subs = Object.create(null)
  }

  $on(eventType, handler){
    this.subs[eventType] = this.subs[eventType] || []
    this.subs[eventType].push(handler)
  }

  $emit(eventType, params){
    if (this.subs[eventType]) {
      this.subs[eventType].forEach(handler => {
        handler(params)
      })
    }
  }
}

let em = new EventEmitter()
//订阅
em.$on('click', (params)=>{
  console.log('点击', params);
})
em.$on('click', (params)=>{
  console.log('点击', params);
})

//发布
em.$emit('click', 1111111)

观察者模式

//观察者模式


class Subject{ // 1.被观察者
  constructor(name){
    this.name
    this.observers = []
    this.state = '开心'
  }
  attach(o){
    this.observers.push(o)
  }
  setState(newState){
    if (this.state !== newState) {
      this.state = newState
      this.notify(newState)
    }
  }
  notify(newState){
    this.observers.forEach(o => o.update(newState))
  }

}



class Observer{
  constructor(name){
    this.name = name
  }
  update(state){
    console.log(`${this.name}:当前的状态是${state}`);
  }
}
// 我家有个小宝宝 , 爸爸和妈妈要关心小宝包的状态 , 小宝宝不开心 会主动通知观察者
let s = new Subject('宝宝');
let o1 = new Observer('爸爸');
let o2 = new Observer('妈妈');
s.attach(o1)
s.attach(o2)
s.setState('不开心');
s.setState('开心');

Promise.all

Promise.all = function all(promises){
  if(!Array.isArray(promises)) throw new TypeError(promises + 'must be an Array')
  var n = 0,result = []
  return new Promise(function (resolve, reject){
    for(var i = 0; i < promises.length; i++){
      (function(i){
        var promise = promises[i]
        if(!isPromise(promise)) promise = Promise.resolve(promise)
        promise.then(function onfullfilled(value){
          n++;
          result[i] = value
          if( n >= promise.length) resolve(result)
        }).catch(function onrejected(reason){
          reject(reason)
        })
      })(i)
    }
  })
}

检测是否是纯粹对象 直属类是Object || Object.create(null)

//检测是否是纯粹对象 直属类是Object || Object.create(null)
const isPlainObject = function isPlainObject(target) {
  let proto,//target的原型
    Ctor
  if (!target || Object.prototype.toString.call(target) !== '[object Object]') return false
  proto = Object.getPrototypeOf(target)
  if (!proto) return true
  Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor
  let ObjectFunctionString = Function.prototype.toString.call(Object); //"function Object() { [native code] }"
  return typeof Ctor === "function" && Function.prototype.toString.call(Ctor) === ObjectFunctionString
}