運行這段代碼:`如何當我運行此代碼後循環
for (var start = 1; start < 10; start++) {
setTimeout(function() {
alert('hello');
}, 3000 * start);
}
alert('Finish');
爲什麼for循環尚未完成,但代碼「警報(」完成「)」仍然可以運行。如何使alert('Finish')
完成循環後運行。謝謝。
運行這段代碼:`如何當我運行此代碼後循環
for (var start = 1; start < 10; start++) {
setTimeout(function() {
alert('hello');
}, 3000 * start);
}
alert('Finish');
爲什麼for循環尚未完成,但代碼「警報(」完成「)」仍然可以運行。如何使alert('Finish')
完成循環後運行。謝謝。
從技術上講,這就是它已經在做的事情。
循環運行(設置超時),然後觸發「完成」警報。我猜你想要的是在完成所有超時之後觸發的「完成」。容易的方法可能會將完成時間添加到自己的超時時間(所以它會在這段時間後運行)。
財產以後這樣的:
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));
注:我改變了定時&使用控制檯日誌所以它運行更快的測試。
你其實不需要'start + 1','start'已經是'10'。 –
工作就像一個魅力,多謝 – YOU
我想提出一個不同的選擇,使用的setInterval,這恕我直言,是更適合於reapeating任務:
var start = 1;
var interval = setInterval(function(){
console.log('hello ' + start);
if (++start === 10) {
console.log('all done');
clearInterval(interval);
}
}, 3000);
這具有在最後一次迭代之後立即記錄「全部完成」的優點。
循環已完成。您傳遞給setTimout的回調不會立即執行,這正是setTimeout的要點。 –
那麼如何改變for循環並按照我的想法執行代碼? – YOU