2012-10-20 36 views
2

我想建立一個觀察者/接收器系統:的Javascript動態方法調用

var listeners = []; 

function MyObj(){ 
    this.myMethod = function(){ 
     // react to event 
    } 
} 

var myObj = new MyObj(); 

function addListener(fn, obj){ 
    alliancesNotify[alliancesNotify.length] = {fn: fn, obj: obj} 
} 

addListener(myObj, myObj.myMethod); // Best way of doing it? 

function notify(objArr){ 
    for (var i in objArr){ 
     objArr[i].obj.fn(); // will this work? 
    } 
} 

notify(listeners); 

我希望爲您的想法上的兩個註釋行,(如果它會實際工作爲expceted),如果有也許是通過調用其方法來通知對象的更直接的方式。 (例如,我注意到一些實現傳遞函數名稱作爲字符串而不是函數的引用,而不是這樣的。)

感謝

回答

2

好吧首先有一個多問題讓我們逐一由一個:

  • objArr[i].obj.fn();是不會做你期望的。它將查找並調用fn方法,但您期望從obj調用myMethod。要解決這個問題,你有多個選項。請使用applycall。所以你的代碼看起來像objArr[i].fn.call(objArr[i].obj)。這就是JS庫如何像jQuery或Mootools或PrototypeJS那樣做。
  • 第二個問題,如果回調函數拋出異常並且有錯誤怎麼辦?在一些瀏覽器中,循環將停止迭代,因此它將不會導致進一步的回調(函數)被調用。解決方案可以再次多次使用,或者使用try catch塊或者做我最喜歡的方式。使用setTimeout所以你的代碼看起來就像下面給出的一樣,因爲JS是單線程的瀏覽器將排隊回調函數,甚至包括錯誤,其餘的不會影響。
 
    function notify(objArr){ 
     for (var i in objArr){ 
      window.setTimeout(function(){ objArr[i].call(objArr[i].obj);}, 0); 
     } 
    } 
  • 這肯定不是最佳,但接近周圍最佳的解決方案,所以對各地的圖書館看看(谷歌它)來改善它。我有我自己寫一個這樣的獨立PUB SUB庫事件管理check it out here