发布订阅模式

它是对象一对多模式,当对象的状态发生改变时,所有依赖它的对象都将得到状态状态的通知。

作用

  1. 应用于异步编程(替代回调函数|async await等)
  2. 对象松散耦合编写代码

简易实现

class Event {
  constructor() {
    this.eventList = new Map()
  }
  // 订阅
  on(eventName, eventFn) {
    if (!this.eventList.has(eventName)) {
      this.eventList.set(eventName, [eventFn])
    } else {
      this.eventList.set(eventName, [...this.eventList.get(eventName), eventFn])
    }
  }
  // 发布
  emit(eventName, ...args) {
    if (this.eventList.has(eventName)) {
      // 有订阅过
      const eventFns = this.eventList.get(eventName)

      eventFns.forEach(fn => {
        fn && fn.call(this, ...args)
      })
    }
  }
  // 取消订阅
  off(eventName, fn) {
    if (this.eventList.has(eventName)) {
      const newFns = this.eventList.get(eventName).filter(item => item !== fn)

      if (newFns.length) {
        this.eventList.set(eventName, newFns)
      } else {
        this.eventList.delete(eventName)
      }
    }
  }
}

// 其它文件直接引入此实例
export default new Event()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
上次更新: 2021/10/22 下午4:10:00
贡献者: 陈书进