實現一個事件匯流排(vue.prototype.$bus)?
本質就是一個訂閱釋出模式的實現。
- 維護一個cache陣列,即訂閱者陣列
- 實現on函式,即增加訂閱者
- 實現off函式,即取消訂閱
- 實現emit函式,即釋出訊息,通知訂閱中心有更新
class EventBus {
constructor() {
this.cache = {};
}
on(name, fn) {
if (this.cache[name]) {
this.cache[name].push(fn);
} else {
this.cache[name] = [fn];
}
}
off(name, fn) {
const tasks = this.cache[name];
if (tasks) {
const index = tasks.findIndex((f) =>
f === fn || f.callback === fn
)
if (index >= 0) {
tasks.splice(index, 1);
}
}
}
emit(name) {
if (this.cache[name]) {
// 建立副本,如果回撥函式內繼續註冊相同事件,會造成死迴圈
const tasks = this.cache[name].slice()
for (let fn of tasks) {
fn();
}
}
}
emit(name, once = false) {
if (this.cache[name]) {
// 建立副本,如果回撥函式內繼續註冊相同事件,會造成死迴圈
const tasks = this.cache[name].slice()
for (let fn of tasks) {
fn();
}
if (once) {
delete this.cache[name]
}
}
}
}
const eventBus = new EventBus()
const task1 = () => { console.log('task1'); }
const task2 = () => { console.log('task2'); }
eventBus.on('task', task1)
eventBus.on('task', task2)
setTimeout(() => {
eventBus.emit('task')
}, 1000)
更多詳情可以看我部落格的另一篇筆記:《設計模式之觀察者模式——Js實現》
相關文章
- 如何在 JavaScript 中實現 Event Bus(事件匯流排)JavaScript事件
- 事件匯流排的設計與實現事件
- 事件匯流排事件
- SpringCloud(六)Bus訊息匯流排SpringGCCloud
- 事件匯流排demo事件
- javascript事件匯流排JavaScript事件
- 如何在 pyqt 中實現全域性事件匯流排QT事件
- AndroidEventBus (事件匯流排) 的設計與實現AndroidIDEdev事件
- 元件間通訊--利用mitt實現事件匯流排元件MIT事件
- 事件匯流排有個 pipe 管道方法事件
- 將Abp預設事件匯流排改造為分散式事件匯流排事件分散式
- Vue事件匯流排(EventBus)Vue事件
- Vue 事件中央匯流排Vue事件
- Spring Cloud Bus 訊息匯流排介紹SpringCloud
- 基於事件匯流排EventBus實現郵件推送功能事件
- 乾貨|Spring Cloud Bus 訊息匯流排介紹SpringCloud
- 在 .NET 中深入瞭解事件匯流排的使用與實現事件
- Flutter中的事件匯流排(EventBus)Flutter事件
- SOFA 原始碼分析— 事件匯流排原始碼事件
- Otto事件匯流排框架的使用事件框架
- 事件匯流排EventBus和觀察者模式事件模式
- 自己動手寫事件匯流排(EventBus)事件
- Otto - 安卓平臺上事件匯流排安卓事件
- 匯流排
- 比 EventBus 更高效的事件匯流排(BusUtils)事件
- Flutter基礎-036-事件匯流排EventBusFlutter事件
- WebWorker與WebSocket實現前端訊息匯流排Web前端
- Vue事件匯流排(EventBus)使用詳細介紹Vue事件
- EventBridge 事件匯流排及 EDA 架構解析事件架構
- Android事件匯流排還能怎麼玩?Android事件
- 前端匯流排前端
- 跟我學SpringCloud | 第八篇:Spring Cloud Bus 訊息匯流排SpringGCCloud
- C#使用Socket實現分散式事件匯流排,不依賴第三方MQC#分散式事件MQ
- 風險洞察之事件匯流排的探索與演進事件
- 在vue專案中自定義事件匯流排eventHubVue事件
- 高吞吐量的Java事件匯流排:MBassadorJava事件
- 【服務匯流排 Azure Service Bus】Service Bus在使用預提取(prefetching)後出現Microsoft.Azure.ServiceBus.MessageLockLostException異常問題ROSException
- 使用SpringCloud實現Java分散式開發【part-7】:Spring Cloud Bus訊息匯流排的介紹及使用SpringGCCloudJava分散式