首頁  >  文章  >  web前端  >  javascript發布訂閱模式的詳解(附範例)

javascript發布訂閱模式的詳解(附範例)

不言
不言轉載
2018-10-26 15:39:003323瀏覽

這篇文章帶給大家的內容是關於javascript發布訂閱模式的詳解(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

發布訂閱模式

事件發布/訂閱模式(PubSub) 在非同步程式設計中幫助我們完成更鬆的解耦,甚至在MVC、MVVC 的架構中以及設計模式中也少不了發布-訂閱模式的參與。

優點:在非同步程式設計中實作更深的解耦

缺點:如果過多的使用發布訂閱模式,會增加維護的難度

實作發布訂閱模式

var Event = function() {
    this.obj = {}
}

Event.prototype.on = function(eventType,fn) {
    if(!this.obj[eventType]) {
        this.obj[eventType] = []
    }
    this.obj[eventType].push(fn)
}

Event.prototype.emit = function() {
    // 取第一个参数,作为eventType
    var eventType = Array.prototype.shift.call(arguments);
    //  获取事件数组
    var arr = this.obj[eventType];
    var len = arr.length;
    // 循环数组,一次执行其中的函数
    for(var i=0;i<len;i++) {
        // 直接调用arr[i],其this指向为undefined(严格模式下)
        // 因此用apply将this指向arr[i]
        // 数组shift函数取出第一个参数,将剩下的参数传入函数中
        arr[i].apply(arr[i],arguments)
    }
}

var ev = new Event()
ev.on('click',function(a) {  // 订阅
    console.log(a)
})

ev.emit('click',1)   // 发布

以上程式碼只能實現先訂閱,再發布。直接發布就會報錯。如何實現可以先發布,然後訂閱?

var Event = function() {
    this.obj = {};
    this.cacheList = [];
}

Event.prototype.emit = function() {
    const args = arguments;  //函数参数
    const that = this;  //this指向,保持cache函数的this指向
    function cache() {
        var eventType = Array.prototype.shift.call(arg)
        var arr = that.obj[eventType]
        for (let i = 0; i < arr.length; i++) {
          arr[i].apply(arr[i], arg)
        }
    }
    this.cacheList.push(cache)  // 采用闭包,保持对emit函数中参数和that的引用
}

Event.prototype.on = function(eventType,fn) {
    if(!this.obj[eventType]) {
        this.obj[eventType] = []
    }
    this.obj[eventType].push(fn)
    // 在订阅函数中执行emit函数中缓存的函数
    for (let i = 0; i < this.cacheList.length; i++) {
        this.cacheList[i]()
    }
}

改成這樣後就實現了先發布函數,再訂閱的過程。但也只能先發布,然後再訂閱,反過來就不行。

#

以上是javascript發布訂閱模式的詳解(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:github.io。如有侵權,請聯絡admin@php.cn刪除