請手寫一個發布-訂閱的模式

發布-訂閱模式也是經典的設計模式之一,它在前端很多地方都有應用,比如javascript事件池Vue的$on、$offnodejs的events模塊和socket通信等等都有應用,也是前端面試比較火熱的考點之一,接下來給大家詳細介紹下發布-訂閱模式

發布-訂閱模式定義了對象間的一種一對多的依賴關系當一個對象的狀態發生變化時,所有依賴它的對象都將得到通知。在JavaScript開發中,我們一般用事件模型來替代傳統的發布-訂閱模式

要手寫一個簡單的發布訂閱模式,其實現思路如下:

  1. 先初始化一個events對象
  2. 調用on方法時,將事件名稱eventName和監聽函數fn存入events對象
  3. 調用emit方法時,通過事件名稱eventNameevents對象中取出對應的回調并執行
  4. off方法:通過事件名稱eventName找出events對象對應的監聽函數并清除
  5. once方法:被emit觸發一次后就立即調用off方法移除監聽,也就是調用once傳入的監聽函數只會執行一次

代碼不多,所以直接上完整代碼

class EventEmitter {constructor() {this.events = {}}on(eventName, fn) {if (!this.events[eventName]) {this.events[eventName] = []}this.events[eventName].push(fn)return this}once(eventName, fn) {const func = (...args) => {this.off(eventName, func)fn.apply(this, args)}this.on(eventName, func)return this}emit(eventName, ...args) {if (!this.events[eventName]) return thisthis.events[eventName].forEach(fn => {fn.apply(this, args)});return this}off(eventName, fn) {if (!this.events[eventName]) return thisif (typeof fn === 'function') {this.events[eventName] = this.events[eventName].filter((f) => f !== fn)return this}this.events[eventName] = nullreturn this}
}

const events = new EventEmitter();events.on('event1', () => {console.log('event1', '第一個監聽函數')
})
events.on('event1', () => {console.log('event1', '第二個監聽函數')
})
events.emit('event1')const fn1 = () => {console.log('event2', '第一個監聽函數')
}
const fn2 = () => {console.log('event2', '第二個監聽函數')
}
events.on('event2', fn1)
events.on('event2', fn2)
events.off('event2', fn1);// 打印結果:
// event1 第一個監聽函數
// event1 第二個監聽函數// 上面代碼有疑問請閱讀下面代碼,這部分解答了上面讀者的疑問
const events = new EventEmitter();// event1部分
events.on('event1', () => {console.log('event1', '第一個監聽函數')
})
events.on('event1', () => {console.log('event1', '第二個監聽函數')
})
events.emit('event1')// event2部分
const fn1 = () => {console.log('event2', '第一個監聽函數')
}
const fn2 = () => {console.log('event2', '第二個監聽函數')
}
events.on('event2', fn1)
events.off('event2', fn1);
events.on('event2', fn2)
events.emit('event2')

  • 可以廣泛應用于異步編程中,這是一種替代傳遞回調函數的方案;
  • 可以取代對象之間硬編碼的通知機制,一個對象不用再顯示地調用一個對象的接口

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

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

相關文章

cefsharp119.4.30(cef119.4.3,Chromium119.0.6045.159)版本升級體驗支持H264及其他多個H264版本

Cefsharp119.4.30,cef119.4.3,Chromium119.0.6045.159 此更新包括一個高優先級安全更新 This update includes a high priority security update. 說明:此版本119.4.3支持H264視頻播放(需要聯系我),其他版本。.NETFramework 4.6.2 NuGet Gallery | CefSharp.WinForms 119.…

運動規劃Motion-Planning隨筆

online verification技術 實時安全校驗技術:留一手 首先計算能否通過剎車這種方式得到一條安全軌跡,(讓速不讓道),當剎車有可能碰撞到行人或其他車輛時,則判斷變道是否會產生碰撞。如果能變道&#xff0…

深度學習之七(深度信念網絡和受限玻爾茲曼機器)

概念 深度信念網絡(Deep Belief Networks,DBN)和受限玻爾茲曼機器(Restricted Boltzmann Machines,RBMs)都是無監督學習的模型,通常用于特征學習、降維和生成數據。 受限玻爾茲曼機器(RBM): 結構: RBM 是一個兩層神經網絡,包括一個可見層和一個隱藏層。這兩層之間…

qt按照不同編碼格式讀取文字(UTF-16LE,UTF-8,UTF-8BOM,UTF-16BE)

enum class EncodingFormat : int {ANSI 0,//GBKUTF16LE,UTF16BE,UTF8,UTF8BOM, }; EncodingFormat VideoPlayer::FileCharacterEncoding(const QString &fileName) {//假定默認編碼utf8EncodingFormat code EncodingFormat::UTF8;QFile file(fileName);if (file.open(QI…

「 系統設計 」 為什么要做架構分層?

「 系統設計 」 為什么要做架構分層? 參考&鳴謝 3.設計模式之分層思維:為什么要做代碼分層架構? 從零開始學架構(八)分層架構和設計模式 架構模式之分層架構總結 文章目錄 「 系統設計 」 為什么要做架構分層&…

解決 IDEA下VUE項目 @符號無法識別的問題

根目錄新建jsconfig.json {"compilerOptions": {"baseUrl": "./","paths": {"/*": ["src/*"]}},"exclude": ["node_modules","dist"] }

IT支持團隊的績效指標和最佳實踐

一名員工在遠程時因筆記本問題尋求IT支持,盡管他們多次嘗試排除故障,但由于缺乏專業知識,最終還是無法訪問工作所需的應用程序。這時,他們需要一名專業的 IT 技術人員來指導他們,但他們只能等待有人注意到并回應他們的…

海報設計必備:揭秘5款炙手可熱的設計工具

1.即時設計:能實現在線協作的海報設計軟件 即時設計作為 2020 年上線的國產設計工具,目前已經有了超百萬的注冊用戶,獲得了廣大設計師的一致好評。與其他傳統海報設計軟件相比,即時設計具有這幾個優點:一是所有功能都…

Chrome 訪問不了項目?10080端口 ERR_UNSAFE_PORT:問題原因 / 解決方案

文章目錄 被禁用端口列表解決方法方法一、更換端口 / 使用代理 / 使用域名方法二、對瀏覽器下手WindowsMac 最近有客戶反饋,在chrome瀏覽器中訪問不了項目,其他瀏覽器都是正常的。 ?奇了怪了,難道客戶對chrome做了什么操作&#x…

Docker | Docker入門安裝

?作者簡介:大家好,我是Leo,熱愛Java后端開發者,一個想要與大家共同進步的男人😉😉 🍎個人主頁:Leo的博客 💞當前專欄:Docker系列 ?特色專欄: My…

探索WebStorm 2023 Mac/win:最強大的JavaScript開發工具

在當今的軟件開發領域,JavaScript已經成為了一種不可或缺的編程語言。而在眾多的JavaScript開發工具中,WebStorm一直以其強大的功能和友好的用戶界面脫穎而出。現在,我們迎來了全新的WebStorm 2023版本,它將帶給開發者們更加出色的…

有機紡織品OCS認證

【有機紡織品OCS認證】 有機產品是指按照這種方式生產和加工的產品。產品符合國際或者國家有機產品要求標準,并通過國家認證機構認證的一切農副產品及其加工品,包括糧食、蔬菜、水果、奶制品、禽畜產品、天然纖維等。 有機紡織品認證是指在使用經過國際或…

華中科技大學李松課題組,利用機器學習預測多孔材料水吸附等溫線

多孔材料的水吸附等溫線是一個非常重要的參數,但這一參數的獲得并不容易。這是因為多孔材料種類過多、結構多元,通過實驗和計算的方式獲得水吸附等溫線數據成本過高,耗時過長。 華中科技大學的李松課題組,建立了一個兩步機器學習模…

LeetCode [簡單] 283. 移動零

給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。 請注意 ,必須在不復制數組的情況下原地對數組進行操作。 283. 移動零 - 力扣(LeetCode) 思路: 快慢指針&…

可以在uni-app使用的類vconsole.js插件

興致勃勃在uni-app項目引入調試工具vconsole.js結果真機調試頁面空白 怎么辦?! 別著急 paradox老師有方法 替代插件下載地址:直接下載插件并引入HbuilderXuni_modules插件 - 類Vconsole APP端調試工具 - HF調試器 - DCloud 插件市場 下載完成在main.js中引入&…

鴻蒙開發環境搭建-deveco-studio 開發工具安裝問題()

從華為官網下載工具deveco-studio, 下載地址 HUAWEI DevEco Studio和SDK下載和升級 | HarmonyOS開發者 這是下載后的工具 1、一步步安裝步驟 報錯了,一般安裝都會報這個錯誤 看似問題不小,其實, 繼續下步,就正常了&#xff0c…

棧回溯--在棧里挑出返回地址

GNU Arm Embedded Toolchain project files : GNU Arm Embedded Toolchain arm-none-eabi-addr2line -e F103_Moduel.axf -a -f 08000350 08001d94 0800260c 匯編中: ;HardFault_Handler ; PROC ; EXPORT HardFault_Handler …

神命令tree的魅力你get到了嗎?

背景 日常工作中,有時候為了明確表達自己的意思,往往需要輸出對應的目錄層級結構,手動一個個輸入往往顯得不那么高級,效率相對較低,這時候擁有可以一鍵輸出目錄結構并且可以快速轉化為文本的工具就比較方便&#xff0…

工業I/O模塊的功能和應用介紹

在工業領域中,不同的設備常常適配不同的通信協議,不同的協議之間無法直接互通,導致現場實施過程中困難重重。工業io模塊可以將各種現場信號轉化為數字信號,然后傳輸給控制器進行處理,實現不同設備之間的互通&#xff0…

抖音直播招聘報白企業或者人力資源公司怎么做?

抖音直播招聘報白是指進入抖音的白名單,允許在直播間或小視頻中發布招聘或找工作等關鍵詞。否則會斷播、不推流、限流。抖音已成為短視頻流量最大的平臺,但招聘企業數量較少。抖音招聘的優勢在于職位以視頻、直播方式展示,留存聯系方式更加精…