2012-11-01 3 views
1

I이 코드가 차단되는 이유를 알지 못합니다. nodejs 비동기 함수를 사용하지만, 이제 논 블로킹 프로그래밍의 본질을 알아 내려고 노력하고 있으며, 어떻게 구현할 수 있습니까? 이것이 내가 생각했던 방식이지만, 여전히 차단하고 있습니다.Javascript -이 코드가 차단되는 이유는 무엇입니까?

var async_func = function(x, func) { 
     func(x+5); 
    }; 

    setTimeout(async_func(5, function(number) { 
     for (var x = 0; x < 1000000000; x++) {;} 
     console.log(number); 
    }), 3000); 

    console.log("done"); 

답변

2

setTimeout()을 사용할 때와 인수가있는 함수를 호출 할 때 함수 참조를 전달할 때 일반적인 실수입니다. 이 코드 행 :

setTimeout(async_func(5, function(number) { 

즉시 async_func()을 실행 한 후 setTimeout()에 (함수하지 않은)가 반환 결과의 통과하고 당신이 원하는 아닙니다. 때로는 그것이 인수가없는 별도의 함수의 당신의 타이머 콜백 함수를 만들어 이해하기 쉽게,

var async_func = function(x, func) { 
    func(x+5); 
}; 

setTimeout(function() { 
    async_func(5, function(number) { 
     for (var x = 0; x < 1000000000; x++) {;} 
     console.log(number); 
    }); 
}, 3000); 

console.log("done");  

또는 :이처럼 나중에 그 함수를 호출 할 수 있습니다 setTimeout() 그래서 setTimeout()에 함수 참조를 전달하고자합니다.

function async_func(x, func) { 
    func(x+5); 
} 

function timer_func() { 
    async_func(5, function(number) { 
     for (var x = 0; x < 1000000000; x++) {;} 
     console.log(number); 
    }); 
} 

setTimeout(timer_func, 3000); 

console.log("done");  
+0

매우 명확한 설명! 하지만 왜 타이머를 사용하지 않고 내 async_func 만 실행하면 차단됩니까? 인터넷에서 정보를 찾으려고하지만 정확히 무엇을 찾고있는 것 같지 않습니다. – jviotti

+0

"블록"이란 무엇입니까? 'async_func' 자체는 비동기 함수가 아니므로 차단해야합니다. – jfriend00

2

시도 :

당신은 (... 익명 또는 도우미 기능을하지 않고에서는 setTimeout에 인수 함수를 호출하지 않아야 (나는 또한 불필요한 for (var x = 0; x < 1000000000; x++) {;} 제거)

var async_func = function(x, func) { func(x+5); }; setTimeout(function(){ async_func(5, function(number) { console.log(number); }); }, 3000); console.log("done"); 

다른 기능을 설정하지 않고 정말로하고 싶다면 @Ian은 다음과 같이 설명합니다.)

r 함수는 당신이 할 수있는 어떤 인자도 가지고 있지 않다. setTimeout(async_func, 3000);하지만이 경우에는 익명의 함수를 호출하는 것이 가장 좋다. (또는 위의 인자로 함수를 호출하는 호출 함수를 선언하는 것이다.

+0

감사합니다. 그렇긴하지만 왜 setTimeout은 인수가있는 함수를 처리 할 수 ​​없습니까? – jviotti

+0

** 익명 함수를 사용하지 않고도 setTimeout에 인수가있는 함수를 호출 할 수 없습니다. ** 기술적으로는'setTimeout'의 첫 번째 매개 변수는 문자열 일 수 있습니다. 연결 문자열을 사용하여 함수 호출을 구성 할 수 있습니다 'setTimeout ("myFunction ("+ var1 + ");"200);과 같은 변수를 사용할 수 있습니다. 그러나 어쨌든 상황에 이상적이지는 않습니다 :) – Ian

+0

@Ian 그 해결책은 있지만 최선의 방법은 아닙니다. @JuanCruzViotti,'for (var x = 0; x <1000000000; x ++) {;}'로 줄을 제거하면 아무 문제없이 작동 할 것입니다. (나는 나의 대답을 업데이트했다). –

관련 문제