發(fā)布訂閱模式
在發(fā)布訂閱模式里跟畅,發(fā)布者咽筋,并不會直接通知訂閱者,換句話說徊件,發(fā)布者和訂閱者奸攻,彼此互不相識。
互不相識虱痕?那他們之間如何交流睹耐?
答案是,通過第三者皆疹,也就是在消息隊列里面疏橄,我們常說的經(jīng)紀(jì)人Broker。
class PubSub {
constructor() {
// 保存監(jiān)聽事件
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}事件添加回調(diào)方法`);
}
} catch (error) {
console.warn(error);
}
}
// 發(fā)布
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);
// 發(fā)布事件
util.publish("event", "訂閱成功");
// 移除訂閱
setTimeout(() => {
util.unSubscribe("event", notice, "已取消訂閱");
}, 3000);