发布订阅模式
它是对象一对多模式,当对象的状态发生改变时,所有依赖它的对象都将得到状态状态的通知。
作用
- 应用于异步编程(替代回调函数|async await等)
- 对象松散耦合编写代码
简易实现
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
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