2014-07-06 2 views
1

node.js에서 비동기 콜백 이벤트를 테스트하기 위해 다음 예제를 구성했습니다. 사실은 오류가 나에게 매개 변수를 반환하지 않는다는 것입니다. 왜 그런가요?노드 비동기 함수 예제가 있습니다. 예상 값이 아닌 콜백 반환

var maxtime = 1000; 

var evenDoubler = function(v, callback) { 
    var waitTime = Math.floor(Math.random() * (maxtime + 1)); 
    if (v%2) { 
     setTimeout(function() { 
      callback(new Error("Odd input")); 
     }, waitTime); 
    } 
    else { 
     setTimeout(function() { 
      callback(null, v*2, waitTime); 
     }, waitTime); 
    } 
} 

for (i=1;i<=10;i++) { 
    evenDoubler(i, function (error, result, waitTime) { 
    if (error){ 
     console.log(error + " by number " + i); 
    } 
    else { 
     console.log("The number is even, and its double is " + result + " (in " + waitTime + " miliseconds).");  
    } 
}); 
} 

반환 된 출력은 (왜 홀수에 나에게 값 (11)을 반환?)

당신의 for 루프가 이미 시간에 완료 때문입니다
Error: Odd input by number 11 
Error: Odd input by number 11 
The number is even, and its double is 20 (in 266 miliseconds). 
The number is even, and its double is 12 (in 444 miliseconds). 
Error: Odd input by number 11 
The number is even, and its double is 4 (in 492 miliseconds). 
The number is even, and its double is 16 (in 578 miliseconds). 
The number is even, and its double is 8 (in 710 miliseconds). 
Error: Odd input by number 11 
Error: Odd input by number 11 

답변

2

첫 번째 비동기 콜백이 너무 i 발생 홀수에 걸리는 if (error) 경로에 대해 기록되는 이유는 11 점입니다.

+0

네, 그래. 물론 11 번째 숫자가 그 시점에서 루프가 이미 완료되었음을 알 수 있습니다. 제가 알고 싶었던 것은 이것이 일어날 이유였습니다. 왜냐하면 내가 예상 한 것은 변수의 단 일 증가와 모든 루프에 대한 실제 값의 로깅 이었기 때문입니다. –

+0

내가 지금 알고있는 것은 이것이 "모든 루프에 대해 잠긴 변수가 아닙니다"라는 것입니다.이 변수는 IIFE를 사용하여 해결됩니다 (모든 루프에 대한 변수 잠금). –

관련 문제