嘗試自定義一個(gè)事件總線
沖天大菠蘿
發(fā)布于 云南 2025-03-31 · 3453瀏覽

事件總線(Event Bus)是一種設(shè)計(jì)模式或機(jī)制,用于在不同組件之間傳遞消息或數(shù)據(jù),通常用于實(shí)現(xiàn)解耦合的通信。通過(guò)發(fā)布-訂閱(publish-subscribe)模式來(lái)實(shí)現(xiàn)。

自定義事件總線屬于一種觀察者模式,其中包括三個(gè)角色:

發(fā)布者(Publisher):發(fā)出事件(Event)

訂閱者(Subscriber):訂閱事件(Event),并且會(huì)進(jìn)行響應(yīng)(Handler)

事件總線(EventBus):無(wú)論是發(fā)布者還是訂閱者都是通過(guò)事件總線作為中臺(tái)的

觀察者模式,是可以做到?jīng)]有事件總線的,直接A過(guò)去觀察B的變化,B變化后直接通知A,不經(jīng)過(guò)C(事件總線),AB直接產(chǎn)生關(guān)系,設(shè)計(jì)模式是很多的,主要有23個(gè)。

也可以實(shí)現(xiàn)自己的事件總線,主要實(shí)現(xiàn)以下三大模塊:

事件的監(jiān)聽(tīng)方法on

事件的發(fā)射方法emit

事件的取消監(jiān)聽(tīng)off

由于事件總線會(huì)在不同組件中進(jìn)行使用,所以我們通常采用類(lèi)形式進(jìn)行編寫(xiě),可以實(shí)例化對(duì)象進(jìn)行使用,復(fù)用度高

首先搭建出整體框架

三個(gè)方法都有對(duì)應(yīng)參數(shù),無(wú)返回值

on:監(jiān)聽(tīng)特定事件,當(dāng)該事件被觸發(fā)時(shí),會(huì)調(diào)用指定的處理函數(shù)

emit:發(fā)射特定事件,通知所有訂閱了該事件的監(jiān)聽(tīng)器

off:取消對(duì)某個(gè)事件的監(jiān)聽(tīng)三個(gè)方法都有對(duì)應(yīng)參數(shù),無(wú)返回值on

通常情況下,我們會(huì)在constructor中初始化一個(gè)空對(duì)象,用來(lái)存儲(chǔ)信息
on方法中,在該對(duì)象中存儲(chǔ)鍵值對(duì),鍵是傳入的事件名,值是事件處理函數(shù),形成關(guān)聯(lián)
通常第一次取的時(shí)候,什么都沒(méi)有,因?yàn)檫€沒(méi)有存入事件名和對(duì)應(yīng)的事件處理函數(shù),這時(shí)候可以進(jìn)行一個(gè)判斷,若為空則默認(rèn)存入一個(gè)數(shù)組,這數(shù)組中后續(xù)用來(lái)存放事件處理函數(shù)和對(duì)應(yīng)this(通過(guò)鍵,存入對(duì)應(yīng)的數(shù)組值)
在 off 方法中,我們的目標(biāo)是找到特定的回調(diào)函數(shù)并將其從事件處理函數(shù)數(shù)組中刪除。如果直接遍歷原數(shù)組 handlers 并在遍歷過(guò)程中進(jìn)行刪除操作,這樣會(huì)對(duì)數(shù)組本身的長(zhǎng)度和順序產(chǎn)生影響,導(dǎo)致一些問(wèn)題
跳過(guò)某些元素:當(dāng)刪除數(shù)組中的某個(gè)元素時(shí),數(shù)組會(huì)重新排列,后續(xù)的元素會(huì)向前移動(dòng),這會(huì)導(dǎo)致在遍歷時(shí)跳過(guò)某些元素,進(jìn)而導(dǎo)致無(wú)法正確找到并刪除所有匹配的回調(diào)函數(shù)
遍歷索引錯(cuò)亂:數(shù)組刪除元素后,數(shù)組長(zhǎng)度減小,如果不小心繼續(xù)用原索引遍歷,可能會(huì)導(dǎo)致超出邊界或遍歷不完全的問(wèn)題
所以我們通過(guò)擴(kuò)展運(yùn)算符創(chuàng)建副本數(shù)組newHandlers來(lái)用于遍歷,但實(shí)際操作依舊針對(duì)原數(shù)組,遍歷時(shí)進(jìn)行刪除不會(huì)導(dǎo)致索引發(fā)生變化進(jìn)而引起長(zhǎng)度和順序問(wèn)題

接著能夠正常使用,總體方法對(duì)應(yīng)邏輯如下:
on注冊(cè)事件,存儲(chǔ)事件名、對(duì)應(yīng)回調(diào)函數(shù)
emit用于觸發(fā)事件,將on存入數(shù)組中的處理函數(shù)進(jìn)行遍歷調(diào)用
off從對(duì)應(yīng)事件名中,移除不需要的事件處理函數(shù)

沖天大菠蘿
沒(méi)有簽名 的 神秘 嘉賓
瀏覽 3453
相關(guān)推薦
最新評(píng)論
贊過(guò)的人
評(píng)論加載中...

暫無(wú)評(píng)論,快來(lái)評(píng)論吧!