2014-02-21 58 views
1

運行這段代碼:`如何當我運行此代碼後循環

for (var start = 1; start < 10; start++) { 
    setTimeout(function() { 
     alert('hello'); 
    }, 3000 * start); 
} 
alert('Finish'); 

爲什麼for循環尚未完成,但代碼「警報(」完成「)」仍然可以運行。如何使alert('Finish')完成循環後運行。謝謝。

+2

循環已完成。您傳遞給setTimout的回調不會立即執行,這正是setTimeout的要點。 –

+0

那麼如何改變for循環並按照我的想法執行代碼? – YOU

回答

1

從技術上講,這就是它已經在做的事情。

循環運行(設置超時),然後觸發「完成」警報。我猜你想要的是在完成所有超時之後觸發的「完成」。容易的方法可能會將完成時間添加到自己的超時時間(所以它會在這段時間後運行)。

財產以後這樣的:

for (var start = 1; start < 10; start++){ 
    setTimeout(function() { console.log('hello'); } 
, 10 * start);}; 

// use final "start" time to set last timeout to fire off its event, after all other timeouts have run 
setTimeout(function() { 
    console.log('Finish'); 
}, 10 * (start+1)); 

注:我改變了定時&使用控制檯日誌所以它運行更快的測試。

+0

你其實不需要'start + 1','start'已經是'10'。 –

+0

工作就像一個魅力,多謝 – YOU

1

你可以試試這個代碼:

var counter = 1; 
for(var i = counter; i < 10; i++){ 
    setTimeout(function(){ 
     counter++; 
     if(counter == 10){ 
      alert("Finish"); 
     } 
     else 
      alert("In process"); 
    }, 10 * i); 
} 

而且看到這個demo

+0

它的工作。謝謝 – YOU

+0

@你我認爲你可以評估我的答案))如果它的工作))謝謝 –

+1

它似乎我只有1評估,我做了以前的答案! – YOU

1

我想提出一個不同的選擇,使用的setInterval,這恕我直言,是更適合於reapeating任務:

var start = 1; 
var interval = setInterval(function(){ 
    console.log('hello ' + start); 

    if (++start === 10) { 
    console.log('all done'); 
    clearInterval(interval); 
    } 
}, 3000); 

這具有在最後一次迭代之後立即記錄「全部完成」的優點。