2016-02-19 60 views
1
function pubsub(){ 

    var events = {}; 

var self = this; 
    self.on = registerEvent; 
    self.emit = triggerEvent; 

function registerEvent(eventName,eventCb){ 

    if(events[eventName] === undefined){ 
     events[eventName] = { 
      'counter' : 0, 
      'subscribers': {}, 
      'length'  : 0 
     } 
    } 

    var counter = events[eventName].counter++; 

    events[eventName].subscribers[counter] = eventCb; 
    events[eventName].length = Object.keys(events[eventName].subscribers).length; 

    var unsubscribeObj = unsubscribe.bind(eventName,counter); 

    return {'unsubscribe':unsubscribeObj}; 

} 

function triggerEvent(eventName,param){ 

    if(events[eventName] !== undefined && events[eventName].length){ 
     var eventList = Object.keys(events[eventName].subscribers); 
     for(var index in eventList){ 
      var eventKey = eventList[index]; 
      events[eventName].subscribers[eventKey].apply({},param); 
     }   
    } 

} 

    function unsubscribe(eventName,counter){ 

    if(events[eventName].subscribers[counter] !== undefined){ 
     delete events[eventName].subscribers[counter]; 
     events[eventName].length = Object.keys(events[eventName].subscribers).length; 
    }else{ 
     console.warn("Event not subscribed"); 
    } 
    } 
} 

我想寫一個pubsub程序。除了 取消訂閱功能,一切正常。JS參數綁定不起作用

var unsubscribeObj = unsubscribe.bind(eventName,counter); 
    return {'unsubscribe':unsubscribeObj}; 

給退訂我傳遞參數拋出綁定,但它不工作時,從外面打電話。

var pObj = new pubsub(); // Works Fine 
var e1 = pObj.on('event1',function(data){ alert(data); }); 
pObj.emit('event1',["hi"]); 
e1.unsubscribe() 

遺漏的類型錯誤:無法讀取屬性「用戶」的未定義

回答

3

的第一個參數bindthis調用原始功能時使用的值;那麼調用它的參數是之後那個。太行

var unsubscribeObj = unsubscribe.bind(eventName,counter); 

創建一個將調用與thiseventNamecounter第一參數的功能。但您的unsubscribe預計eventName作爲第一個參數,而counter作爲第二個參數。

如果你想同時eventNamecounter參數是參數,通過不同的第一個參數bind。如果你不關心什麼thisunsubscribenull通常是你選擇什麼樣的:

var unsubscribeObj = unsubscribe.bind(null, eventName, counter); 

更多bindspec | MDN

0

您需要檢查是否parent屬性比較之前存在。

function unsubscribe(eventName,counter){ 

    if(events[eventName] && events[eventName].subscribers[counter] !== undefined){ 
//---^^^^^^^^^^^^^^^^^^^^ 
    delete events[eventName].subscribers[counter]; 
    events[eventName].length = Object.keys(events[eventName].subscribers).length; 
    }else{ 
    console.warn("Event not subscribed"); 
    } 
} 

這是因爲這樣的錯誤:

Uncaught TypeError: Cannot read property 'subscribers' of undefined

產生,因爲events[eventName]是不確定的,所以events[eventName].suscribers不存在。

您避免了此更改的錯誤。

+0

這不是它未定義的原因。 –

+0

我正在閱讀你的答案。也許我錯了,但我認爲這是一個改進:)然而,感謝您的評論 –

+0

沒有當我在那裏添加斷點eventName和計數器有一些無效的數據.. – balaphp

0

,如果你要綁定的上下文,你應該做這樣的事情:

var unsubscribeObj = unsubscribe.bind(this); 
return {'unsubscribe':unsubscribeObj(eventName,counter)}; 
+0

不,這個人會立即退訂... – balaphp