如何實現一個簡單的發佈訂閱模式

背景

在業務開發中,經常會遇到要處理跨頁面通信的問題,比如說用戶打開了一個網站,網站的某些頁面需要根據用戶的登錄的狀態不同,顯示不同的數據。顯然這需要我們在登錄成功的那一刻,
去通知到那些需要改變的頁面。爲了解決類似這樣的問題,發佈訂閱模式誕生了。

思路

一個簡單的發佈訂閱模式需要事件的綁定和觸發是互相隔離的,同時支持動態的添加和刪除事件。基於此就有了一個思路:

  1. 定義一個變量存儲這些事件
  2. 定義一個監聽方法,用於把事件添加到事件變量中
  3. 定義一個刪除方法,用於把是事件從變量中移除
  4. 定義一個觸發方法,用於調用變量中的事件

實現

根據上面的思路,大致可以知道使用方式類似下面:

var emitter = new EventEmitter();

var handle = function (data) {
    console.log(data)
}

// 頁面A訂閱LOGIN事件
emitter.on('LOGIN', handle)


// 登錄成功,觸發發佈
emitter.emit('LOGIN', {user: { name: 'Jan', age: 18}})

具體代碼實現

function EventEmitter() {
  // 事件變量
    this._event = {}
}

// 添加訂閱
EventEmitter.prototype.on= function (type, handle) {
    this._event[type] = this._event[type] || []

    this._event[type].push(handle)
}

// 移除訂閱
EventEmitter.prototype.remove = function (type, handle) {
    var index = (this._event[type] || []).indexOf(handle)

    if(index !== -1) {
        this._event[type].splice(index, 1)
    }
}

// 觸發發佈
EventEmitter.prototype.emit = function (type, data) {
    (this._event[type] || []).forEach(function (handle) {
        handle(data)
    })
}

如何實現一個簡單的發佈訂閱模式首發於聚享小站,如果對您有幫助,不要忘記點贊支持一下呦🎉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章