摘要:什么是發布訂閱模式什么是發布訂閱模式我這里不多就不多闡述了,給大家提供幾個我覺得講的比較好的博文,請各位自行閱讀發布訂閱模式解釋這一篇文章應該是一個寫的,但是設計模式這種東西并不分語言,各位可以借鑒一下中理解發布訂閱模式這一篇是我們前
什么是發布訂閱模式
什么是發布訂閱模式我這里不多就不多闡述了,給大家提供幾個我覺得講的比較好的博文,請各位自行閱讀
發布-訂閱模式解釋 這一篇文章應該是一個java coder寫的,但是設計模式這種東西并不分語言,各位可以借鑒一下
Javascript中理解發布--訂閱模式這一篇是我們前端人寫的,但是比較長,大家有耐心可以看看
我對發布中心的實現,可以不看(看了能夠更好的理解發布訂閱模式)
//實現發布中心 /* * log=[{ * index: Number, 日志編號(自增) * type: String, 日志類型("subscribe","unsubscribe","publish") * eventName: String, 事件名 * time: new Date(), 時間 * fun:Function 訂閱/取訂的方法(只有日志類型為"subscribe"或"unsubscribe"的才有) * param:Object 觸發事件時的參數(只有日志類型為"publish"的才有) * }] * eventCenter = { * eventName:[Function,Function] //eventName即為事件名,其值為訂閱方法列表 * } * .subscribe(eventName, fun) 訂閱 eventName:事件名 fun:訂閱方法 * .unsubscribe(eventName, fun) 取訂 eventName:事件名 fun:訂閱方法 * .publish(eventName[,param]) 發布 eventName:事件名 param:事件參數 * .showLog([filter]) 日志展示 filter 過濾器,同數組的過濾器用法 返回過濾后的log * .showEventCenter([eventName]) 事件中心 eventName 事件名 返回事件綁定的方法 * */ let subscribeCenter = function () { //事件中心 let eventCenter = {}; //日志 let log = []; //添加日志函數 function pushLog(type, eventName, fun, param) { let info = { index: log.length, type: type, eventName: eventName, time: new Date() }; if (fun) { info.fun = fun; } if (param) { info.param = param; } log.push(info) } return { //訂閱 subscribe(eventName, fun) { pushLog("subscribe", eventName, fun); eventCenter[eventName] = eventCenter[eventName] || []; eventCenter[eventName].push(fun); }, //取消訂閱 unsubscribe(eventName, fun) { pushLog("unsubscribe", eventName, fun); let onList = eventCenter[eventName]; if (onList) { for (let i = 0; i < onList.length; i++) { if (onList[i] === fun) { onList.splice(i, 1); return } } } }, //發布 publish(eventName, param) { pushLog("publish", eventName, null, param) let onList = eventCenter[eventName]; if (onList) { for (let i = 0; i < onList.length; i++) { onList[i](param) } } }, //顯示日志 showLog(filter) { filter = filter || (() => true); let returnLog = log.filter(filter); returnLog.forEach(x => { let y = {}; for (let key in x) { y[key] = x[key] } return y }); return returnLog; }, //顯示事件中心 showEventCenter(eventName) { let selectEM = eventName ? eventCenter[eventName] : eventCenter, returnEM = {}; for (let key in selectEM) { returnEM[key] = []; selectEM[key].forEach(x => { returnEM[key].push(x) }); } return returnEM } } }();
如果有看我上一篇文章中事件監聽實現的朋友應該對這個不部分代碼有一種熟悉的感覺,確實事件監聽和發布訂閱的實現非常的像。我主要多做的就是一個日志的拓展,保證了每次的動作都可以被監聽和查看;
發布中心API這個在上面是有的,但是因為上面的部分有一些同學是不看的,所以就在這里摘出來,方便這些同學了解發布中心的用法
/* * log=[{ * index: Number, 日志編號(自增) * type: String, 日志類型("subscribe","unsubscribe","publish") * eventName: String, 事件名 * time: new Date(), 時間 * fun:Function 訂閱/取訂的方法(只有日志類型為"subscribe"或"unsubscribe"的才有) * param:Object 觸發事件時的參數(只有日志類型為"publish"的才有) * }] * eventCenter = { * eventName:[Function,Function] //eventName即為事件名,其值為訂閱方法列表 * } * .subscribe(eventName, fun) 訂閱 eventName:事件名 fun:訂閱方法 * .unsubscribe(eventName, fun) 取訂 eventName:事件名 fun:訂閱方法 * .publish(eventName[,param]) 發布 eventName:事件名 param:事件參數 * .showLog([filter]) 日志展示 filter 過濾器,同數組的過濾器用法 返回過濾后的log * .showEventCenter([eventName]) 事件中心 eventName 事件名 返回事件綁定的方法 * */發布/訂閱模式在異步中的應用
這里是重點,需要大家仔細看,理解了這段代碼不光可以解決異步問題,還可以理解發布訂閱者模式是如何應用的;
//發布者 let f1 = function () { setTimeout(function () { console.log(""done" 事件發布 參數:", 123); subscribeCenter.publish("done", 123); console.log("事件中心", subscribeCenter.showEventCenter()); console.log("f3 取訂 "done""); subscribeCenter.unsubscribe("done", f3); setTimeout(function () { console.log(""done" 事件發布 參數:", 233); subscribeCenter.publish("done", 233); console.log("事件中心", subscribeCenter.showEventCenter()); console.log("日志", subscribeCenter.showLog()); }, 100) }, 100) }; //訂閱者 let f2 = function (param) { console.log("f2 is running, param is", param); }; //訂閱者 let f3 = function (param) { console.log("f3 is running, param is", param) }; //訂閱 console.log("f2 訂閱 "done""); subscribeCenter.subscribe("done", f2); console.log("f3 訂閱 "done""); subscribeCenter.subscribe("done", f3); //發布 f1();
先貼運行結果
在這里可以看到,該模式與事件監聽模式非常相似,但是所有的發布都通過了同一個發布中心來控制,這樣的話可以方便我們追蹤整個事件的狀態;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/103268.html
摘要:概念觀察者模式被廣泛地應用于客戶端編程中。所有的瀏覽器事件,等都是使用觀察者模式的例子。在觀察者模式中,一個對象訂閱另一個對象的指定活動并得到通知,而不是調用另一個對象的方法。此外,觀察者模式還可用于實現數據綁定。 概念 觀察者模式被廣泛地應用于JavaScript客戶端編程中。所有的瀏覽器事件(mouseover,keypress等)都是使用觀察者模式的例子。這種模式的另一個名字叫自...
摘要:應用需要正確并合適響應各種網絡請求用戶操作計時事件和各種延時動作。好了,我們的新流程圖畫出來了提示城市名稱查找不是很復雜,谷歌地圖為此提供了非常簡單的。形象點表示就是,函數是一等公民。 By Hubert Zub | Oct 3, 2018 原文 當你將關注點從樣式,美學和網格系統轉移到邏輯,框架和編寫JavaScript代碼時。一切都開始了,你會發現你處于你的web開發歷程中最激動人...
摘要:微內核架構在大型前端系統中的應用只討論架構,不討論框架名詞解釋由一群盡可能將數量最小化的軟件程序組成,他們負責提供實現一個操作系統所需要的各種機制和功能。而微內核架構已經在操作系統和很多的產品的后端服務及前端中經過了很多的實踐。 微內核架構在大型前端系統中的應用 只討論架構,不討論框架 1、名詞解釋 由一群盡可能將數量最小化的軟件程序組成,他們負責提供、實現一個操作系統所需要的各種機制...
摘要:小程序很多方法都是異步的原因官方說法天生異步剛接觸小程序的時候,發現很多微信提供的都是異步的,如路由跳轉,設置和讀取緩存,還有獲取節點信息等微信的,都是異步的,需要傳入回調函數才能獲得結果,在我們正常的前端開發中,這些都不是異步的,當時很奇 1. 小程序很多方法都是異步的原因(官方說法:天生異步) 剛接觸小程序的時候,發現很多微信提供的api都是異步的,如路由跳轉,設置和讀取緩存,還有...
閱讀 640·2021-08-17 10:15
閱讀 1724·2021-07-30 14:57
閱讀 1978·2019-08-30 15:55
閱讀 2820·2019-08-30 15:55
閱讀 2708·2019-08-30 15:44
閱讀 670·2019-08-30 14:13
閱讀 2386·2019-08-30 13:55
閱讀 2592·2019-08-26 13:56