今天在家写了大半天的代码,没事干写了个node代理服务,可以将被墙的js脚本代理到自己的服务器上,实际使用了下,发现问题还不少,因为只代理了js脚本,但是现在的脚本里一般都有很多异步请求,而这些脚本内部的请求却无法自动代理。只能主动查找脚本内部的请求链接,主动替换!而且现在很多的请求都用的是https协议,但是我自己的服务器只支持http协议。这就导致这个程序有点鸡肋!

好了不提其他的了,言归正传,咱们说回到今天的主题,现在正在进行的项目node-router上来,昨天在家完成了该项目的核心代码只一的 事件订阅/发布模式 ,今天就来简单说说我是怎么写的,以及我对该模式的理解!

什么是订阅发布模式?

简单来说,订阅发布模式就是一种基于主题/事件通道,将被触发的事件消息通知给主题订阅者的方式!说的直白一点就是在某个事件主题被触发时,就将消息传递给订阅了该主题的对象,进行相应的某种操作!

这体现在js代码里,就像我们订阅了某个元素的点击事件,当该事件被触发时,就会调用我们提前定义好的回调函数一样!而订阅发布模式就是提供了这种,订阅/发布的通道!

下面我们来看一个简单的例子:

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
// 定义事件发布、定于类
class Event {
constructor() {
this.eventList = {};
}

// 事件订阅
on(name, fn) {
this.eventList[name] = this.eventList[name] || [];
this.eventList.push(fn);
}

// 移除事件
remove(name) {
this.eventList[name] = null;
}

// 事件发布
tigger(name, ...args) {
if (this.eventList[name] && this.eventList[name].length > 0) {
this.eventList[name].map(item => item(...args));
}
}
}

// 定义实例
const eventBus = new Event();
// 订阅邮件
eventBus.on('getEmail', (text) => {
alert(text);
})

// 发布
setTimeout(() => {
eventBus.tigger('getEmail', '你的邮件到了')
}, 3000)

这就是一个简单的demo了,看上面的代码你会发现,其实就是一个自定义事件/触发系统!当然,这只是一个简单的demo而已,想要真的写好还是需要有很多细节需要处理,比如是不是可以定义只执行一次的事件,是不是可以一次删除所有事件,当我只想删除某个订阅的某个事件,其他同名事件保留等等!好的,今天就先写到这里,等有时间在对比下观察者模式和订阅发布模式有什么区别!

本文允许全文转载,转载请注明来源:
平凡公子 - node-router开发之:事件订阅发布