发布订阅模式
在发布订阅模式里,发布者,并不会直接通知订阅者,换句话说,发布者和订阅者,彼此互不相识。
互不相识?那他们之间如何交流?
答案是,通过第三者,也就是在消息队列里面,我们常说的经纪人Broker。
class PubSub {
constructor() {
// 保存监听事件
this.event = {};
}
// 订阅
subscribe(eventName, fun) {
try {
if (!this.event.hasOwnProperty(eventName)) {
this.event[eventName] = [];
}
if (typeof fun == "function") {
this.event[eventName].push(fun);
} else {
throw new Error(`请给${eventName}事件添加回调方法`);
}
} catch (error) {
console.warn(error);
}
}
// 发布
publish(eventName, arg) {
try {
if (this.event.hasOwnProperty(eventName)) {
this.event[eventName].map((item) => {
item.call(null, arg);
});
} else {
throw new Error(`${eventName}事件未被注册`);
}
} catch (error) {
console.warn(error);
}
}
// 移除订阅
unSubscribe(eventName, fun, arg) {
try {
if (this.event.hasOwnProperty(eventName)) {
this.event[eventName].map((item, index) => {
if (item == fun) {
this.event[eventName].splice(index, 1);
item.call(null, arg);
}
});
}
} catch (error) {
console.warn(error);
}
}
}
// 实例化
const util = new PubSub();
function notice(params) {
console.log(params);
}
// 订阅事件
util.subscribe("event", notice);
// 发布事件
util.publish("event", "订阅成功");
// 移除订阅
setTimeout(() => {
util.unSubscribe("event", notice, "已取消订阅");
}, 3000);