2011-03-06 74 views
0

我正在寫一個小模塊,它有幾個不同的方面,都基於Ajax調用。我想允許主要的ajax函數,即beforeSend,成功,完成等(我使用jQuery)是可定製的。Javascript - 傳遞和查找回調函數

這樣做的最好方法是什麼?

我目前在模塊中有一個選項對象,可以通過傳遞給init函數的選項對象進行擴展。在這裏,我傳遞嵌套ojects一個「回調」對象爲每個不同類型的動作......

 var insertCallbacks = { 

     before : function() { 

     }, 
     success : function() { 

     }, 
     error : function() { 

     }, 
     complete : function() { 

     } 
    }; 

    var updateCallbacks = { 
     before : function() { 

     }, 
     success : function() { 

     }, 
     error : function() { 

     }, 
     complete : function() { 

     } 
    }; 

    var callbacks = { 
     insert : addCallbacks, 
     update : removeCallbacks  
    }; 

    MY_MODULE.init({callbacks : callbacks}); 

問題是這樣的,然後變得有點凌亂,測試每一種的存在有關ajax回調的方法。

任何人都可以提供任何建議在這個好/更好的模式。

回答

3

我會去自定義事件,而不是回調。所以,你的模塊中,你將有類似的代碼:

MY_MODULE.trigger('updateComplete'); 

,並在模塊之外的所有部件(以及裏面如果需要的話),你綁定處理程序(現在又回調):

MY_MODULE.bind('updateComplete', function() { 
    alert('update completed'); 
}); 

Custom events in jQuery open doors to complex behaviors,或谷歌任何其他文章。自定義事件會幫助你保持代碼的結構,並且更易於測試

加上:你需要經常檢查是否有任何的回調,所以你的代碼變得

if (callbacks && callbacks.insert) { 
    callbacks.insert(); 
} 

提高你的模塊功能並加強它,有一天你會遇到一種情況,即在相同的情況下應該傳遞很少的回調(例如,兩個實體或UI組件對模塊「更新」感興趣)......這會讓你的工作太困難。隨着活動,你總是有一個不帶條件之一的代碼行

MY_MODULE.trigger('updateComplete'); 

,以檢查是否有附加任何處理(感興趣的事件),你可以有多達同一事件需要處理。

+0

+1打我到21秒:D – Tomalak 2011-03-06 22:37:56

+0

@Tomalak:Danke und Entschuldigung;) – Maxym 2011-03-06 22:40:16

+0

Kein問題。 :-)無論如何,你的是更好的答案。 – Tomalak 2011-03-06 22:44:03

1

只是做jQuery同樣的事情。讓您的模塊觸發事件(通過trigger())並在必要時將處理程序附加到這些事件(通過bind())。這樣你就不必在你的模塊裏面檢查什麼函數正在監聽(或者如果有的話)。

由於你的代碼不包含任何東西我可以使用樣本,這是很難添加代碼到這個答案。

+0

+1你也值得擁有它;) – Maxym 2011-03-06 22:41:53