2013-03-04 5 views
0

작동하지 :자바 스크립트 비동기 기능은 내가 예를 들어 다음과 같은 한

var first=setInterval(function() { 
var t=new Date(); 
console.log("Started: ",t); 
sleep(function(){ 
    var t=new Date(); 
    console.log("Finished: ",t); 
}); 
},500); 

function sleep(callback){ 
for (var i=0;i<10000000000;i++){ 
    //waiting 
    } 
    callback(); 
} 

이럴 잠이 비동기 적으로 실행해야하지만 나던 출력 :

Started: Mon Mar 04 2013 12:31:10 GMT+0200 (EET) 
Finished: Mon Mar 04 2013 12:31:23 GMT+0200 (EET) 
Started: Mon Mar 04 2013 12:31:24 GMT+0200 (EET) 
Finished: Mon Mar 04 2013 12:31:36 GMT+0200 (EET) 
Started: Mon Mar 04 2013 12:31:36 GMT+0200 (EET) 
+5

* "IMHO sleep은 비동기 적으로 실행되어야합니다"* 왜? 비동기로 만들려고 아무것도하지 않았습니다. (즉,'setInterval' 콜백 내에서) –

+0

JavaScript가 스레딩과 어떻게 작동하는지 오해했습니다. 모든 코드는 단일 스레드에서 실행되며 비동기 작업의 콜백은 스레드가 유휴 상태가되어 자신을 실행할 수 있기를 기다려야합니다. –

답변

1

setInterval 콜백에 대한 다음 호출을 트리거하지 않습니다 콜백에 대한 이전 호출은 여전히 ​​실행 중입니다. sleep 함수는 비동기 적이므로 이후의 setInterval 콜백을 유지합니다.

브라우저에서 web workers을 사용하지 않는 경우 모든 JavaScript 코드는 단일 스레드에서 실행됩니다. 코드가 sleep이 실행될 상황을 설정하려고 시도한 다음 setInterval의 후속 콜백이 발생하고 sleep을 실행하는 두 번째 스레드가 시작되는 것 같습니다. 그런 일은 일어나지 않습니다 (위 참조). 당신이 장기 실행 작업이 (browsers that support them에) 주요 자바 스크립트 스레드를 실행하려면이있는 경우

당신은 사용 웹 근로자는하지만, 그런 일을 할 수 있습니다.

관련 문제