/**
* 發(fā)布-訂閱 實(shí)現(xiàn)
*/
class PubSub {
constructor (){
// 訂閱的事件對(duì)象
this.events = {}
}
// 發(fā)布
publish(eventName, ...data){
if(this.events[eventName]){
// 遍歷執(zhí)行該事件的所有訂閱 回調(diào)
this.events[eventName].forEach(cb => {
// 繼承訂閱的回調(diào)方法,并把發(fā)布的參數(shù)傳過去,同時(shí)執(zhí)行其回調(diào)方法
cb.call(this, ...data)
});
}
}
// 訂閱
substribe(eventName, callback){
// 可能有多個(gè)地方訂閱同一個(gè)事件,所以每一個(gè)事件對(duì)象用數(shù)組保存
if(this.events[eventName]){
this.events[eventName].push(callback)
}else{
this.events[eventName] = [callback]
}
}
// 刪除訂閱
unSubstribe(eventName, callback){
if(this.events[eventName]){
this.events[eventName] = this.events[eventName].filter((cb)=>{
// 在當(dāng)前事件數(shù)組中,剔除出事件回調(diào)和callback相同的訂閱
return cb !== callback;
})
}
}
}
// 發(fā)布-訂閱 調(diào)用
var pdd = new PubSub();
console.log('start');
// 訂閱回調(diào) 1
function subCallback(data, name){
console.log('訂閱到:age=' + data + name)
}
// 訂閱回調(diào) 2
function subCallback2(data, name){
console.log('訂閱2:age=' + data + name)
}
setTimeout(function(){
console.log('=====發(fā)布:age => 21=====')
pdd.publish('age', 21, 'hwb');
},1000)
console.log('訂閱:age')
pdd.substribe('age', subCallback);
pdd.substribe('age', subCallback2);
setTimeout(function(){
console.log('=====發(fā)布:age => 25=====')
pdd.publish('age', 25, 'hwb');
},2000)
setTimeout(function(){
console.log('****移除訂閱subCallback****')
pdd.unSubstribe('age', subCallback);
},2500)
setTimeout(function(){
console.log('=====發(fā)布:age => 30=====')
pdd.publish('age', 30, 'abc');
},3000)
javascript 實(shí)現(xiàn) 發(fā)布-訂閱模式
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 前言 一個(gè)多月前,面試時(shí)被問到發(fā)布-訂閱模式,面試完就查閱資料學(xué)習(xí)了下。這篇文章我將記錄我對(duì)此的理解并用Javas...
- 什么是發(fā)布-訂閱模式? 發(fā)布-訂閱模式又叫觀察者模式,它定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變...
- 觀察者模式(Observer) 觀察者模式:定義了對(duì)象間一種一對(duì)多的依賴關(guān)系,當(dāng)目標(biāo)對(duì)象 Subject 的狀態(tài)發(fā)...