2012-12-05 39 views
0

我用JavaScript實現一個簡單的pub/sub來幫助我充分了解這種模式的工作原理:我的出版商不會返回訂閱功能 - DIY的pub/sub實現

//obj to hold references to all subscribers 
pubSubCache = {}; 

//subscribe function - push the topic and function in to pubSubCache 
subscribe = function (topic, fn) { 
    pubSubCache[topic] = fn; 
}; 

//publish function 
publish = function (topic, obj) { 
    var func; 
    console.log(obj); 
    console.log(pubSubCache); 
    // If topic is found in the cache 
    if (pubSubCache.hasOwnProperty(topic)) { 
     //Loop over the properties of the pubsub obj - the properties are functions 
     //for each of the funcitons subscribed to the topic - call that function and feed it the obj   
     for (func in pubSubCache[topic]) { 
      //this console.log returns a long list of functions - overloadsetter,overloadgetter,extend etc 
      //I expected to see the 'therapist' function here... 
      console.log(func); 
      //error occurs here - it should be calling the therapist function 
      pubSubCache[topic][func](obj); 
     } 
    } 
}; 


function therapist (data) { 
    alert(data.response); 
} 

subscribe('patient/unhappy', therapist); 
publish('patient/unhappy',{response:'Let me prescribe you some pills'}) 

我幾乎在那裏,但在我的代碼中似乎有一個奇怪的問題。發佈者函數搜索包含對訂閱者的所有引用併成功找到匹配項的對象。然後,當我試圖在循環做了去那所預訂的函數的引用我回來這麼久的功能,而不是功能列表我想:

overloadSetter overloadGetter 延長 實施 隱藏 保護 $ family $構造函數

我最初認爲這些函數來自函數的原型,但它們不是。

任何想法?希望這是有道理的。

回答

1

在您的訂閱中,您當然希望允許多個訂閱主題。每個主題的高速緩存條目應該爲此陣列:

//subscribe function - push the topic and function in to pubSubCache 
subscribe = function (topic, fn) { // if new topic init to empty array 
    if (!pubSubCache.hasOwnProperty (topic)) 
     pubSubCache[topic] = []; 
    pubSubCache[topic].push (fn); 
}; 

在發佈,你需要調用每個函數中的主題緩存:

//publish function 
publish = function (topic, obj) { 
    if (pubSubCache.hasOwnProperty (topic)) { 
    for (var f = pubSubCache[topic].length; f--;) { 
     pubSubCache[topic][f](obj); 
    } 
    } 
}; 

見琴:http://jsfiddle.net/cRTRL/1/

0

啊,它似乎是一個紅鯡魚。我看到的函數返回的結果是使用jsfiddle和mootools進行測試的結果。我看到的功能是從那裏。

不幸的是我的代碼雖然沒有固定.....現在還沒有進入for in循環。