发布/订阅(PUB/SUB)是一种消息模式,它有两个参与者:发布者和订阅者。发布者向某个信道(channel)发布一条消息,订阅者绑定这个信道,当有消息发布至信道时就会接受到一个通知。最重要的一点是,发布者和订阅者是完全解耦的,彼此并不知道对方的存在。两者仅仅共享一个信道的名称。
发布者和订阅者的解耦可以让你的运用易于拓展,而不必引入额外的交叉依赖的耦合,从而提高了运用的可维护性,添加额外功能也非常容易。
代码实现如下:
const event = {
subscribe: function(name, fn) {
const list = this.events[name] || [];
list.push(fn);
this.events[name] = list;
return this;
},
publish: function(name, data) {
const list = this.events[name] || [];
list.forEach(fn => {
fn(data);
})
},
unsubscribe: function(name, fn) {
if(!name && !fn) {
this.events = {};
return this;
}
if(!fn) {
delete this.events[name];
return this;
}
const list = this.events[name];
if(list) {
this.events = list.filter(item => item !== fn)
}
return this;
},
attach: function(obj) {
obj.events = {};
obj.on = this.on;
obj.emit = this.emit;
}
}
网友评论