2011-11-23 29 views
1

這樣的函數中可選成功和錯誤回調的最佳實踐是什麼?這種方法有意義嗎?我似乎有點臃腫。在函數中設置可選回調的最佳方法

函數聲明:

var myFunc = function(myNumber, options){ 
    options = options || {}; 
    options.onSuccess = options.onSuccess || function(){}; 
    options.onError = options.onSuccess || function(){}; 

    var myNewNumber = myNumber * 2; 

    if(newVar > 10){ 
     options.onSuccess(myNewNumber); 
    }else{ 
     options.onError(myNewNumber); 
    } 
} 

有回調調用它:

myFunc(2,{ 
    onError: function(myNewNumber){ 
     // do stuff 
    }, 
    onSuccess: function(myNewNumber){ 
     // do stuff 
    } 
}) 

調用它,而不回調:

myFunc(2); 
+1

你在這裏做什麼看起來很好。您在最佳實踐方面尋找哪些方面?另一種方法是使用'error'作爲第一個傳入參數的單個回調函數,當沒有發生錯誤時該參數爲null。 –

+0

我看到的一個問題是,您沒有檢查onSuccess和onError(您是否有拼寫錯誤)是否有函數。可能想補充一點。 – pradeek

回答

2

我會稱他們之前檢查的函數的存在做:

var myFunc = function(myNumber, options){ 
    options = options || {}; 

    var myNewNumber = myNumber * 2; 

    if(newVar > 10){ 
     if (options.onSuccess) { options.onSuccess(myNewNumber); } 
    }else{ 
     if (options.onError) { options.onError(myNewNumber); } 
    } 
} 

這取決於你有多少次會調用這些回調。如果它到處都是,那麼你的方式可能會更好,或者至少更乾淨的代碼。

+0

對於我的情況,我認爲這個答案是最合適的:) – wilsonpage

4

有幾件事要注意;

  1. options.onSuccess = options.onSuccess || function(){};正在檢查成員的存在,而不是檢查其功能。

    你可能想options.onSuccess = (typeof options.onSuccess == "function") ? options.onSuccess : function() { };

  2. 這同樣適用於onError

  3. 由於爲輕微的優化,你可以指向空函數相同的功能;而不是重新創建它兩次。如果你正在使用jQuery,jQuery的定義jQuery.noop()

    options.onSuccess = options.onSuccess || jQuery.noop; 
    options.onError = options.onSuccess || jQuery.noop; 
    
  4. 在回調是異步的情況下,你會離開自己開到options.onSuccessoptions.onError您的支票後正在改變,但在此之前回調解僱;

    var myFunc = function(myNumber, options){ 
        options = options || {}; 
        options.onSuccess = options.onSuccess || function(){}; 
        options.onError = options.onSuccess || function(){}; 
    
        var myNewNumber = myNumber * 2; 
    
        setTimeout(function() { 
         if(newVar > 10){ 
          options.onSuccess(myNewNumber); 
         }else{ 
          options.onError(myNewNumber); 
         } 
        }, 2000); 
    } 
    
    var obj = { 
        success: function() { alert('foo'); }, 
        error: function() { alert('foo'); }, 
    }; 
    
    myFunc(10, obj); 
    delete obj.success; 
    delete obj.error; 
    

    當回調被執行,successerror將是不確定的。

+0

非常感謝!我想你想進入的細節類型取決於這是一個公共API還是內部使用。在我的情況下,它只是在內部,所以我知道函數將功能等 – wilsonpage

+0

+1的細節:D –

相關問題