2011-07-22 34 views
0

我在數組中保存代碼行,並嘗試用setTimeout()逐個單元地運行它們。eval和setTimeout在一個循環中

該執行代碼得好:

for (i=0; i<restorePoints.length; i++){ 
    eval(restorePoints[i]); 
} 

,但我希望有每次迭代之間的短暫延遲:我想使用的setTimeout()代替eval()函數。對於沒有某些原因而工作:

for (i=0; i<restorePoints.length; i++){ 
    setTimeout(restorePoints[i],1000); 
} 

for (i=0; i<restorePoints.length; i++){ 
    setTimeout(eval(restorePoints[i]),1000); 
} 

我怎麼辦呢? 感謝

回答

2

循環很快。它會連續創建所有超時,所有超時都將同時觸發。您可以讓時間取決於循環變量,即在每次迭代增加時間,或者,我會做什麼,只用一個超時和遞歸調用:

(function() { 
    var data = restorePoints; 
    var run = function(i) { 
     setTimeout(function() { 
      var entry = data[i]; 
      if(entry) { 
       eval(entry); 
       run(i+1); 
      } 
     }, 1000); 
    }; 
    run(0); 
}()); 

注意,有除了延遲eval(string)setTimeout(string, ...)之間的差:

eval將在當前範圍評估參數而setTimeout(和setInterval)將在全球範圍內評估它。

這可能與您有關。

+0

謝謝。它正在工作! –

2

如果你打算這樣做,其中的任意一種方式,你需要將函數調用包在一個匿名函數:

for (i=0; i<restorePoints.length; i++){ 
    setTimeout(function(){eval(restorePoints[i]}),1000); 
} 

否則你沒有設置EVAL火在超時時間內,您將執行Javascript代碼的結果(無論在這種情況下是什麼)設置爲setTimeout操作的對象。

+0

這仍然會同時觸發所有超時。因爲它將評估字符串(僅'setTimeout(eval(restorePoints [i]),1000);'是錯誤的),因此將函數傳遞給setTimeout並不是必要的。 –

+0

好點。我錯過了這部分問題。 –