2013-07-02 2 views
1
for(;i<5;i++) 
{ 
(function(z){ 
    setTimeout(function(){console.log(z);},2000);})(i); 
} 

2 초 후에 한 번에 0 1 2 3 4 5를 인쇄합니다. 왜 그렇습니까? 2 초 후에 각 번호를 인쇄하려면 해결책은 무엇입니까?자바 스크립트 코드에서 시간 지연이 작동하지 않습니다.

+2

증가 지연 : 다음 i에서 setTimeout 후속 사용을 위해 f 기능 개체를 만드는 즉시 호출 익명 함수에 의해 사용되는 변수 x를 사용하여 동봉? '2000 * i' – elclanrs

+0

타이머가 모두 동시에 * 작동 * - setTimeout *이 즉시 반환 됨 * (비 블로킹)이므로 모든 setTimeouts가 동시에 * 만들어져 모두로 설정됨을 기억하십시오 화재가 발생했을 때부터 같은 간격 (2000ms)으로 발사하십시오. – user2246674

+0

괜찮 으면 2000 * i.It 작동합니다.하지만 2000 + i를 넣으면 한 번에 표시됩니다. 왜 그렇습니까? –

답변

1

귀하의 시간 제한 간격을해야하고 나는 항상 또한 이유 2000+를 이해하는 read the documentation하십시오 그래서 특정 일

Live Demo

var tIds=[]; 
for(var i=0;i<5;i++) { 
(function(z){ 
    tIds[i]=setTimeout(function(){window.console&&console.log(z);},2000*i); //fire 2000,4000,6000 
    })(i); 
} 

에 사항 clearTimeout 수 있습니다 각 하나를 저장하기 위해 다른 VAR를 사용 나는 작동하지 않는 것 같습니다

1

이 코드를 사용해보십시오.

//Referring your code for better understanding.. 
    for(i=0;i<5;i++) { 
    (function(z){ 
     setTimeout(function(){console.log(z);},2000*z);})(i); 
    } 
+1

"0 1 2 3 4"가 아니라 실제로 "1 2 3 4 5"를 인쇄합니다. 증가 plz 조심하십시오. – neuront

+0

@neuront : 내 실수를 알려 주셔서 감사합니다. 나는 그것을 업데이트했습니다. :) –

1

당신은 5 비동기, 거의 동시에, 함수의 호출을 발사한다.

0

당신이 setInterval를 사용하여 DIFF 접근 방식을 시도해 볼 수도,

var timer = setInterval(function(){printThing();},2000); 

var i = 0;  
function printThing(){ 
    if(i<=5){ 
    window.console && console.log(i); 
    ++i; 
    } 
    else{ 
    clearInterval(timer) 
    } 
}//end function 

를 heres 예를 들어 http://jsfiddle.net/W9vS4/2/

+0

경고가 차단됩니다. – mplungjan

1

setTimeout2 초 동안 코드의 실행을 차단하지 않습니다. 사실 setTimeout이 즉시 반환되고 루프가 계속됩니다. 따라서 5 개의 비동기 호출이 모두 시간 초과 후 거의 동시에 트리거되었습니다.

나는

 
function print(i) { 
    if (i >= 5) return; 

    console.log(i); 
    setTimeout(function() { 
     print(i + 1); 
    }, 2000); 
} 

print(0); 
0

setTimeout(fn,delay)은 MS의 지연 delay 후 주어진 함수 fn 실행이 재귀와 같은 버전 싶습니다, 당신이 원하는 접근합니다. 그래서 당신은 단순히 2000을 사용하여 i을 곱할 수 :

for(;i<5;i++) { 
    setTimeout(function(){console.log(z);},2000*i); 
} 

당신이, 당신이보고하거나 사용하는 클로저를 사용하여, setTimeout에 사용하는 함수를 반환하는 함수를 만들어야보고하거나 fni를 사용하려는 경우 i.

for(var i=0;i<5;i++) 
{ 
    var f = function(x){ 
     return function(){console.log(z+'#'+x);} 
    }(i); 
    setTimeout(f,2000*i); 
} 

jsFiddle

+0

그러나 2000 *을 사용하면 각 시간마다 1 초씩 지연이 증가합니다. 같은 간격으로 숫자를 인쇄하려면 어떻게해야합니까? 시각? –

+0

아니요, 매번 2 초 (2000ms) 씩 증가합니다. 조정 된 jsfiddle를보십시오. – KooiInc

관련 문제