2015-10-05 85 views
-2

我試圖在for循環中運行setTimeout。我已經按照建議將setTimeout移動到一個單獨的函數中。然而,在循環結束時,一切似乎都立即開始。setTimeout for循環一次全部觸發

在這個例子中,我希望console.logs每秒觸發一次。

function setDelay(i) { 
    setTimeout(function(){ 
     console.log(i); 
    }, 1000); 
} 

for (var i = 1; i <= 10; ++i) { 
    setDelay(i); 
} 
+0

我對輸出真的很好奇,我猜''我'變量保留的價值,因爲它在不同的功能?如果是循環變量,它肯定會輸出10次。 – TJHeuvel

+0

我只是很好奇:你爲什麼要問一個問題,甚至不想回答人們的意見和答案? – sbedulin

回答

0

你的代碼的問題是它會創建10個超時,在1秒後或多或少同時發生。

如果您希望每秒執行一次(或任何其他頻率),則可以使用setInterval。

0

實現這一目標最簡單的方法是通過指數乘以超時:

function setDelay(i) { 
    setTimeout(function(){ 
     console.log(i); 
    }, i * 1000); 
} 
0

有一個在你的循環沒有延遲,讓你真正想要的是在1000毫秒第一次和2000毫秒的設置間隔秒等

function setDelay(i) { 
    setTimeout(function(){ 
     console.log(i); 
    }, 1000 * i); 
} 

for (var i = 1; i <= 10; ++i) { 
    setDelay(i); 
} 

這可以很容易地通過乘以你的索引變量的時間來實現。

0

您可以更好地使用setInterval()而不是setTimeout()。使用clearInterval()可以阻止它運行。你所做的代碼不起作用,因爲for循環本身沒有範圍。您可以使用setInterval()來解決for循環。

0

你也可以這樣做:

(function updateEverySecond(){ 
    console.log(1); 
    setTimeout(updateEverySecond, 1000); 
})(); 
0

到計數器採用setInterval和參考可能是你更好的解決方案。

(function(){ 
 
    var count  = 0, 
 
     upperBound = 3, 
 
     intervalTime = 1000, 
 
     interval  = setInterval(function(){ 
 
     if (count === upperBound) { 
 
     clearInterval(interval); 
 
     } else { 
 
      console.log(count); 
 
      count++; 
 
     } 
 
     }, intervalTime); 
 
}());

希望幫助你!