2011-11-23 4 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(){};은 기능을 확인하는 대신 구성원의 존재 여부를 확인합니다.

    당신은 onError

  2. 만큼 약간의 최적화를 위해, 당신은 동일한 기능에 비어있는 기능을 가리킬 수 options.onSuccess = (typeof options.onSuccess == "function") ? options.onSuccess : function() { };

  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 –

관련 문제