2013-05-23 2 views
2

값을 반환 할 다음 함수를 고려하십시오.Node.js 함수에서 값을 반환하는 올바른 방법

방법 1 :

function getData() { 
    var myData = ''; 
    var DateObj = new Date(); 
    for (i=0; i<50000; i++) { 
     myData += "'" + DateObj.toString() +"', "; 
    } 

    return myData; 
} 

방법 2 :

function getData(calbck) { 
    try{ 
    var myData = ''; 
    var DateObj = new Date(); 
    for (i=0; i<50000; i++) { 
     myData += "'" + DateObj.toString() +"', "; 
    } 
    } catch(e){ 
    return calbck(e,null); 
    } 
    return calbck(null, myData); 
} 

내가 테스트 한 두 가지 방법이 작동합니다. 어떤 것이 최선의 선택입니까?

감사


업데이트 : 다음 코드로 테스트.

function getData1() { 
    var myData = ''; 
    var DateObj = new Date(); 
    for (i=0; i<50000; i++) { 
     myData += "'" + DateObj.toString() +"', "; 
    } 
    return myData; 
} 

function getData2(calbck) { 
    try{ 
    var myData = ''; 
    var DateObj = new Date(); 
    for (i=0; i<50000; i++) { 
     myData += "'" + DateObj.toString() +"', "; 
    } 
    } catch(e){ 
    return calbck(e,null); 
    } 
    return calbck(null, myData); 
} 

console.log('call getData1() start'); 
console.time('5000000-getData1()'); 
getData1() 
console.log('call getData1() End'); 
console.timeEnd('5000000-getData1()'); 

console.log('call getData2(calbck) start'); 
console.time('5000000-getData2(calbck)'); 
getData2(function(err,Returned_value){ 
if(err) return console.log(err); 
    //console.log(Returned_value); 
    console.log('call getData2(calbck) End'); 
    console.timeEnd('5000000-getData2(calbck)'); 
}); 

출력 : 그것은 모두 당신의 기능은 동기 또는 비동기 여부에 내려 오는

D:\Test>node app.js 
call getData1() start 
call getData1() End 
5000000-getData1(): 91ms 
call getData2(calbck) start 
call getData2(calbck) End 
5000000-getData2(calbck): 76ms 

D:\Test>node app.js 
call getData1() start 
call getData1() End 
5000000-getData1(): 111ms 
call getData2(calbck) start 
call getData2(calbck) End 
5000000-getData2(calbck): 78ms 
+3

첫 번째 IMO가 가장 간단합니다. 함수가 비동기 적이기 때문에이 예제에서는 콜백을 사용할 필요가 없습니다. – robertklep

+0

테스트 코드가 –

+0

인이 질문을 업데이트하여 성능을 기준으로 테스트하는 것이 정말로 중요합니다. 차이점은 (@robertklep에서 언급 한 것처럼) 콜백을 사용하는 후자의 함수는 비동기 실행을 위해 사용되는 것입니다. 예를 들어 일부 IO 작업이 완료 될 때까지 대기하는 경우입니다. –

답변

2

"비동기"함수 서명을 사용하는 것이 좋은 이유는 현재 구현이 동기식 인 경우에도 마찬가지입니다. getData이라는 함수 (특히 "stub"이라고 비명을 지르는 구현)는이 함수가 앞으로 I/O (네트워크, 파일 시스템)를 수행하고 있음을 암시합니다. getData 함수에 비동기 함수 시그니처를 지정하면 getData을 사용하는 모든 코드가 콜백을 통과해야합니다. 그리고 그것은 좋은 것일 수 있습니다!

나중에 이러한 메서드의 함수 시그니처를 변경하면 getData을 기반으로하는 모든 코드에 대해 직접 또는 간접적으로 파생 될 수 있습니다.

질문이 가상의 computeSum 함수에 관한 것이고 어떤 메서드 서명을 사용하면 동기 함수 서명을 사용하는 것이 좋습니다. 하지만 지금은 그렇게 명확하지 않습니다.

일반적으로 구현이 I/O를 수행 할 가능성이 높다면 비동기 서명을 작성하거나 약속을 반환하는 함수를 제공합니다. 아니.

+0

멋지게 설명 .. 시간 내 주셔서 감사합니다 .. –

3

.

함수가 동기식이고 모든 계산이 즉시 완료되면 첫 번째 방법을 사용하십시오.

함수가 비동기이며 디스크 또는 네트워크 I/O와 같은 리소스를 사용하거나 기다리는 경우 두 번째 방법이 유일한 옵션입니다.

예에서 함수는 동기식이므로 첫 번째 함수를 사용해야합니다.

+0

매우 도움이 .. 시간 내 주셔서 감사합니다. –

관련 문제