2012-03-02 6 views
2

이와 같은 작업을 수행하는 가장 좋은 방법은 무엇입니까? 타이머에서 for 루프를 어떻게 수행합니까?

var a, _i, _len; 

for (_i = 0, _len = b.length; _i < _len; _i++) { 
    a = b[_i]; 
    //do this thing 
    //wait a second, then continue the loop 
} 

JS 감사에서

for a in b 
    #do this thing 
    #wait a second, then continue the loop 
!

답변

4

for (i in b) 루프에서 매 초마다 하나 개의 항목을 처리하려면, 당신은 이런 식으로 작업을 수행 할 수 있습니다

var list = []; 
// accumulate list of items to operate on into an array 
// that can be incremented through 
for (var i in b) { 
    list.push(i); 
} 

function next() { 
    if (list.length > 0) { 
     var item = list.shift(); 
     // do something with the next item here 

     // do the next iteration one second later 
     setTimeout(next, 1000); 
    } 
} 
// start it 
next(); 
+0

이 재귀 적 접근 방식은 이벤트 사이에보다 정확한 시간을 제공하고 간격을 설정하고 완료시이를 지우는 것이므로 올바른 대답으로 표시 할 것입니다. Thanks @ jfriend00 – fancy

+0

@fancy - 완전성을 위해, 이것은 기술적으로 재귀 적이 아닙니다. 'next()'의 첫 번째 호출은'setTimeout()'이 실행되기 전에 완료되고'next()'에 대한 다음 호출을 시작하므로 실제로 재귀가 아닙니다. 그러나 나는 당신의 요점을 이해합니다. – jfriend00

+0

각 루프 반복 중에'setTimeout'을 호출 할 때 성능에 미치는 영향은 무엇입니까? 어떤 것이 있거나'setInterval' 사용에 차이가 있습니까? – LandonSchropp

2

~ 1 초마다 실행해야하는 코드 조각이있는 경우 setInterval을 사용하고 루프를 잊어 버릴 수 있습니다.

setInterval(function() { 
    // do stuff 
    }, 1000); // every second (or so... not real time, but close enough) 

나는 이것이 당신이 요구하는 것을 성취한다고 믿습니다. 매초마다 루프에서 코드를 실행하려는 것처럼 보입니다. 이렇게하면됩니다.

+0

두 번째 코드는'for' 루프와 다른 항목을 처리하려고하기 때문에 매초마다 코드를 실행하는 것과 관련하여'for (i in b) '루프가 있다는 것이 확실합니다. 왜 당신이 질문의 그 부분을 무시할 수 있다고 생각하는지 모르겠습니다. – jfriend00

+0

@ jfriend00 : 다음 반복에서 다음 요소를 잡아내는 것은 엄청나게 어렵습니까? (그것은 수사학이었고, 물론 그렇지 않았습니다). 나는 네가하는 말을 보았지만, 일이 더 복잡 할 수도있다. 실제로 우리가 볼 수없는 코드에서 무슨 일이 일어나고 있는지에 달려 있습니다. –

+0

@ jfriend00 : 예, 당신 말이 맞습니다.하지만 내 의견에서 제안한 바를 정확히 수행했습니다. 그러나 어떤 이유로 든 여전히 논쟁 중입니다. 나는이 대답이 좋지 않다는 것을 인정한다, 나는 단지 되돌아 가지 않았고 이미 정답 (즉, 너의 것)이있는 것처럼 편집하지 않았다. –

3

나는이 자바 스크립트로 작업 것이라고 생각 : 당신이 항목 완료 될 때까지

var b = [1, 2, 3]; 
var timer; 
var i = 0; 
function timerFunction() { 
    // base case 
    if (i >= b.length) { 
     clearInterval(timer); 
     return; 
    } 

    var element = b[i]; 

    // do stuff to b here 

    i++; 
} 

// if you want to execute it right away 
timerFunction(); 

// start the timer 
timer = setInterval(timerFunction, 1000); 
+0

OP가 블록을 실행하기를 원하는 것처럼 루프 요구 사항을 무시해야한다고 생각한다. 매초마다 코드를 읽습니다. s/그는 단지'setInterval'에 대해서 모른다. 나는 틀릴 수도 있지만 그 질문에서 얻은 것입니다. –

+0

네가 틀렸어 – fancy

+0

나는 1 초 간격으로 컬렉션을 반복하는 법을 더 구체적으로 묻고 있다고 생각했다. – LandonSchropp

관련 문제