手寫發布訂閱模式

手寫實現一個簡易的發布訂閱模式,通常有以下幾個關鍵點:

  1. 訂閱(subscribe):用戶訂閱特定的事件,當該事件觸發時,執行與事件關聯的回調函數。

  2. 發布(publish):當某個事件發生時,發布該事件,并通知所有訂閱了該事件的回調函數。

發布訂閱模式實現

我們可以創建一個 EventEmitter 類,實現 subscribe、unsubscribe(取消訂閱)和 publish(發布)方法。

實現代碼:

class EventEmitter {
constructor() {
// 存儲事件名和對應的訂閱者列表
this.events = {};
}

// 訂閱事件
subscribe(event, listener) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(listener); // 將訂閱者(回調函數)添加到事件的訂閱者列表
return () => this.unsubscribe(event, listener); // 返回取消訂閱的函數
}

// 取消訂閱
unsubscribe(event, listener) {
const listeners = this.events[event];
if (!listeners) return;

const index = listeners.indexOf(listener);
if (index !== -1) {listeners.splice(index, 1);  // 移除指定的回調函數
}

}

// 發布事件
publish(event, …args) {
const listeners = this.events[event];
if (!listeners) return;

listeners.forEach(listener => listener(...args));  // 執行每個訂閱者的回調

}
}

說明:

  1. subscribe:

如果事件尚未存在,則為該事件創建一個空數組。

將訂閱者(即回調函數)推入事件對應的數組中。

返回一個取消訂閱的函數,方便用戶手動移除某個事件的訂閱。

  1. unsubscribe:

用于取消訂閱,查找指定事件的回調函數并從訂閱者列表中移除它。

  1. publish:

用于觸發事件,通知所有訂閱者。

通過 forEach 遍歷事件對應的回調列表,執行每個回調函數。

使用示例:

const emitter = new EventEmitter();

// 訂閱事件
const onUserLogin = (username) => {
console.log(${username} has logged in!);
};
const onUserLogout = (username) => {
console.log(${username} has logged out!);
};

const unsubscribeLogin = emitter.subscribe(‘login’, onUserLogin);
const unsubscribeLogout = emitter.subscribe(‘logout’, onUserLogout);

// 發布事件
emitter.publish(‘login’, ‘john_doe’); // 輸出: john_doe has logged in!
emitter.publish(‘logout’, ‘john_doe’); // 輸出: john_doe has logged out!

// 取消訂閱
unsubscribeLogin(); // 取消登錄事件的訂閱
emitter.publish(‘login’, ‘jane_doe’); // 不會輸出任何信息,因為已經取消訂閱

// 再次發布注銷事件
emitter.publish(‘logout’, ‘jane_doe’); // 輸出: jane_doe has logged out!

擴展:

如果需要支持一次性事件(例如訂閱者只想接收一次事件),可以實現一個 once 方法,訂閱后自動取消訂閱。

還可以支持事件參數的篩選、優先級等功能。

總結:

該實現提供了一個簡單的發布訂閱系統,支持事件的訂閱、取消訂閱和發布。

通過此模式,事件的發布者與訂閱者之間解耦,適合用于異步通信、消息推送、事件驅動的編程等場景。

如果你需要進一步的功能擴展或者有其他問題,隨時告訴我!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73803.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker入門篇

使用docker可以很快部署相同的環境,這也是最快的環境構建,接下來就主要對docker中的基礎內容進行講解.Docker 是一個用于開發、交付和運行應用程序的開源平臺,它可以讓開發者將應用程序及其依賴打包到一個容器中,然后在任何環境中運行這個容器&#xff0…

Qt Widgets、Qt Quick

一、核心概念 ?Qt Widgets? Qt框架中的傳統桌面UI開發組件庫,基于C實現,提供按鈕、文本框等控件?。適用于需要深度集成操作系統底層功能或復雜業務邏輯的桌面應用?。 ?Qt Quick? QML的標準庫和工具包,提供預置的視覺組件(如…

LinuX---Shell正則表達式

正則表達式 正則表達式使用單個字符串來描述、匹配一系列符合某個語法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。在Linux中,grep,sed,awk等命令都支持通過正則表達式進行模式匹配…

nginx配置txt文件點擊鏈接后下載

手上有一個txt文件,上傳到文件服務器后,點擊路徑是在瀏覽器里直接打開了,用戶需要的是下載到本地 nginx新增配置 location ~* /ExcelDownload/envScript/(.\.txt) {add_header Content-Disposition "attachment; filename$1";add…

相機光學(四十七)——相紙材質

1. 光面相紙 光面相紙表面光滑,亮度高,反光性好,能夠呈現出清晰、鮮艷的圖像效果,適合用于表現色彩艷麗、反差要求較高的題材,如產品照、藝術照和風景照。然而,這種相紙容易沾上指紋和灰塵。 2. 絨面相紙…

LabVIEW 線性擬合

該 LabVIEW 程序實現了 線性擬合(Linear Fit),用于計算給定一組數據點的斜率(Slope)和截距(Intercept),并將結果可視化于 XY Graph 中。本案例適用于數據擬合、實驗數據分析、傳感器…

Swift 并發中的任務讓步(Yielding)和防抖(Debouncing)

網羅開發 (小紅書、快手、視頻號同名) 大家好,我是 展菲,目前在上市企業從事人工智能項目研發管理工作,平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術,包括iOS、前端、Harmony OS、Java、Python等…

【Android】RuntimeShader 應用

1 簡介 RuntimeShader 是 Android 13(T)中新增的特性,用于逐像素渲染界面,它使用 AGSL(Android Graphics Shading Language)編寫著色器代碼,底層基于 Skia 圖形渲染引擎。官方介紹詳見 → Runti…

小程序API —— 53 本地存儲

小程序本地存儲是指在小程序中使用 API 將數據存儲在用戶的設備上,以便小程序在運行時和下次啟動時快速地讀取這些數據; 小程序本地存儲的 API 可以分為兩類,每一類可以分為四種: 同步 API: 存儲:wx.setS…

el-table樹形表格合并相同的值

el-table樹形表格合并相同的值 el-table樹形表格合并相同的值讓Ai進行優化后的代碼 el-table樹形表格合并相同的值 <style lang"scss" scoped> .tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;} } …

虛幻基礎:移動組件

文章目錄 移動組件&#xff1a;角色的移動信息和移動控制walk&#xff1a;行走falling&#xff1a;跳躍&下落 通用設置重力&#xff1a;模式通用重力max acceleration&#xff1a;模式通用加速度 walk制動降速行走&#xff1a;速度超過最大速度時的減速力 falling空氣控制空…

DeepSeek + Kimi 自動生成 PPT

可以先用deepseek生成ppt大綱&#xff0c;再把這個大綱復制到Kimi的ppt助手里&#xff1a; https://kimi.moonshot.cn/kimiplus/conpg18t7lagbbsfqksg 選擇ppt模板&#xff1a; 點擊生成ppt就制作好了。

Unity 解決TMP_Text 文字顯示異常的問題

問題 Unity 中TMP_Text 文字顯示異常大多可分為兩種情況。①制作TMP 字體選用的文本不包含該文字&#xff1b;②制作TMP 字體選用的ttf 源不包含該文字。 第一種情況&#xff0c;制作TMP 字體選用的文本不包含&#xff0c;只需在選用的Charater File 中添加再重新生成即可。 …

Day19:把數字翻譯成字符串

現有一串神秘的密文 ciphertext&#xff0c;經調查&#xff0c;密文的特點和規則如下&#xff1a; 密文由非負整數組成數字 0-25 分別對應字母 a-z 請根據上述規則將密文 ciphertext 解密為字母&#xff0c;并返回共有多少種解密結果。 LCR 165. 解密數字 - 力扣&#xff08…

CentOS下安裝ElasticSearch(日志分析)

準備目錄 搞一個自己喜歡的目錄 mkdir /usr/local/app 切換到該目錄 cd /usr/local/app 下載 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-linux-x86_64.tar.gz 選擇其他版本 點擊進入官網

汽車機械鑰匙升級一鍵啟動的優點

汽車機械鑰匙升級一鍵啟動的優點主要包括&#xff1a; 便捷性&#xff1a;一鍵啟動功能的引入極大地提升了用車便捷性。車主無需翻找鑰匙&#xff0c;只需在車輛感應范圍內輕觸啟動鍵&#xff0c;即可輕松發動汽車。 安全性&#xff1a;移動管家專車專用一鍵啟動系統配備了防…

【深度學習量化交易16】觸發機制設置——基于miniQMT的量化交易回測系統開發實記

我是Mr.看海&#xff0c;我在嘗試用信號處理的知識積累和思考方式做量化交易&#xff0c;應用深度學習和AI實現股票自動交易&#xff0c;目的是實現財務自由~ 目前我正在開發基于miniQMT的量化交易系統——看海量化交易系統。 很多朋友關心回測系統的開發進展&#xff0c;在正式…

RabbitMQ 和 Redis 的選擇

在處理大規模消息場景時&#xff0c;RabbitMQ 和 Redis 的選擇需根據具體需求權衡。 大規模消息場景的關鍵考量 ?吞吐量需求&#xff1a; ?Redis&#xff1a;更適合 ?超高頻寫入?&#xff08;如百萬級/秒&#xff09;&#xff0c;但需犧牲部分可靠性。?RabbitMQ&#xff…

【從零開始學習計算機科學與技術】計算機網絡(七)應用層

【從零開始學習計算機科學與技術】計算機網絡(七)應用層 應用層DNS域名資源記錄域名解析:域名解析的種類:電子郵件SMTP簡單郵件傳輸協議POP3IMAP文件傳輸(FTP、TFTP和NFS)FTPTFTPNFSWWW超文本HTMLURLHTTP代理服務器:遠程登陸Telnet和rlogin多媒體通信協議應用層 其最靠…

圖解AUTOSAR_CP_WatchdogDriver

AUTOSAR WatchdogDriver模塊詳解 AUTOSAR MCAL層看門狗驅動模塊詳細解析 目錄 1. 模塊概述2. 架構位置 2.1. 組件架構 3. 主要功能4. API接口5. 配置參數 5.1. 配置模型 6. 錯誤代碼7. 狀態管理 7.1. 狀態機 8. 處理流程 8.1. 活動流程 9. 操作序列 9.1. 典型操作序列 10. 硬件…