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

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

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

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

訂閱者(Subscriber):訂閱事件(Event),并且會進行響應(Handler)

事件總線(EventBus):無論是發(fā)布者還是訂閱者都是通過事件總線作為中臺的

觀察者模式,是可以做到沒有事件總線的,直接A過去觀察B的變化,B變化后直接通知A,不經過C(事件總線),AB直接產生關系,設計模式是很多的,主要有23個。

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

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

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

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

由于事件總線會在不同組件中進行使用,所以我們通常采用類形式進行編寫,可以實例化對象進行使用,復用度高

首先搭建出整體框架

三個方法都有對應參數(shù),無返回值

on:監(jiān)聽特定事件,當該事件被觸發(fā)時,會調用指定的處理函數(shù)

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

off:取消對某個事件的監(jiān)聽三個方法都有對應參數(shù),無返回值on

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

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

沖天大菠蘿
沒有簽名 的 神秘 嘉賓
瀏覽 3795
相關推薦
最新評論
贊過的人
評論加載中...

暫無評論,快來評論吧!