2011-05-17 244 views
3
for (var i=list.length; i>=0; i--){ 
    //do something....      
} 

我想使用setInterval使這個過程花費1分鐘,無論列表中有多少項目。因此,如果有10個項目,它會觸發每6秒,30項,每兩秒等。set循環for循環?

感謝您的任何幫助!

+0

你可以給你一些背景信息,你想要完成什麼?要花一分鐘時間,這完全取決於你在每次迭代中做什麼,以及單次迭代需要多長時間,並且可能很難實現。 – Gerry 2011-05-17 08:15:21

+1

另外,請確保您不要將任何關鍵任務代碼放在上面,也不要以爲它會一直按照您的計劃開火。我不確定它是否已在Chrome中實現,但瀏覽器可以在頁面位於後臺選項卡時優化資源使用情況,並可能最終以更大的時間間隔呼叫您的定時器。 – DarthJDG 2011-05-17 08:32:26

回答

6

像這樣的事情可以做:

var list = [1,2,3,4,5,6,7,8,9,10]; 
var timeFrame = 60000; 
var interval = timeFrame/(list.length-1); 
var i = 0; 

(function iterate() { 
    if (list.length > i) { 
     console.log(list[i]); 
     i++; 
    } 
    setTimeout(iterate, interval); 
})(); 

JsFiddle Demo

我不是當然如果是這樣的話您要查找的內容,但是在給定的時間範圍內,這將「遍歷」列表中的所有項目,而不使用for循環。該功能將始終使用setTimeout「自稱」。超時是根據項目的數量在開始時計算的。

該解決方案比setInterval更「可信」。當前一個動作已經完成時,下一個超時將被設置,所以它不會疊加。

+0

1分鐘是60000毫秒 – mplungjan 2011-05-17 08:24:48

+0

@mplungjan是的,只是有這個值的測試:)。忘了改回它,謝謝。 – kapa 2011-05-17 08:26:17

+1

您可以將迭代狀態變量放入閉包中以避免使用全局變量。你不想做我在Ocamel做的事情。 :) – DarthJDG 2011-05-17 08:26:43

-1

你會做

function code(i) { 
    return function() { alert(i); }; 
} 

var period = 60 * 1000/(list.length - 1); 
for (var i=list.length; i>=1; i--){ 
    setTimeout(code(list[i - 1]), period * (i - 1)); 
} 
+3

'setInterval'的第一個參數應該是函數,第二個延遲。 – Lekensteyn 2011-05-17 08:17:29

+0

對不起,現在難以置信的模糊的心態 – Novikov 2011-05-17 08:23:04

+1

將毫不拖延地執行該功能。參見[jsFiddle](http://jsfiddle.net/RFw8A/)。 'setTimeout'或者需要一個函數或者一個字符串(不建議使用,它就像'eval')作爲第一個參數。您正在調用函數而不是將函數作爲參數,所以除非'code()'返回一個函數,否則這將不起作用。 – kapa 2011-05-17 08:45:48

-2

嘗試類似如下:

var interval = 2; 
for (var i=list.length; i>=0; i--){ 
    setTimeout(your_code_here(), i*interval); 
} 
+1

這是行不通的,因爲您立即執行該功能。從your_code_here中刪除(),同時在x * 2毫秒內執行此操作。 – mplungjan 2011-05-17 08:41:14

+0

@ i100發表評論:我不認爲這會起作用:var interval = 2; for(var i = list.length; i> = 0; i - ){setTimeout(your_code_here(),i * interval); }當「your_code_here()」正在等待執行時,循環仍在繼續。 和循環將在一個非常短的時間內完成(可能是1ms或更短,取決於你的cpu)... – Yuankun 2011-05-17 09:12:26

1
var totalItem = list.length; 
setInterval(function(){ alert('');}, 60000/totalItem); 
+2

警報是阻止指令。我修正了你的拼寫錯誤 – mplungjan 2011-05-17 08:23:31

+0

thnx ...糾正... – KoolKabin 2011-05-17 08:25:39