for (var i=list.length; i>=0; i--){
//do something....
}
我想使用setInterval使這個過程花費1分鐘,無論列表中有多少項目。因此,如果有10個項目,它會觸發每6秒,30項,每兩秒等。set循環for循環?
感謝您的任何幫助!
for (var i=list.length; i>=0; i--){
//do something....
}
我想使用setInterval使這個過程花費1分鐘,無論列表中有多少項目。因此,如果有10個項目,它會觸發每6秒,30項,每兩秒等。set循環for循環?
感謝您的任何幫助!
像這樣的事情可以做:
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);
})();
我不是當然如果是這樣的話您要查找的內容,但是在給定的時間範圍內,這將「遍歷」列表中的所有項目,而不使用for
循環。該功能將始終使用setTimeout
「自稱」。超時是根據項目的數量在開始時計算的。
該解決方案比setInterval
更「可信」。當前一個動作已經完成時,下一個超時將被設置,所以它不會疊加。
你會做
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));
}
'setInterval'的第一個參數應該是函數,第二個延遲。 – Lekensteyn 2011-05-17 08:17:29
對不起,現在難以置信的模糊的心態 – Novikov 2011-05-17 08:23:04
將毫不拖延地執行該功能。參見[jsFiddle](http://jsfiddle.net/RFw8A/)。 'setTimeout'或者需要一個函數或者一個字符串(不建議使用,它就像'eval')作爲第一個參數。您正在調用函數而不是將函數作爲參數,所以除非'code()'返回一個函數,否則這將不起作用。 – kapa 2011-05-17 08:45:48
嘗試類似如下:
var interval = 2;
for (var i=list.length; i>=0; i--){
setTimeout(your_code_here(), i*interval);
}
這是行不通的,因爲您立即執行該功能。從your_code_here中刪除(),同時在x * 2毫秒內執行此操作。 – mplungjan 2011-05-17 08:41:14
@ 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
你可以給你一些背景信息,你想要完成什麼?要花一分鐘時間,這完全取決於你在每次迭代中做什麼,以及單次迭代需要多長時間,並且可能很難實現。 – Gerry 2011-05-17 08:15:21
另外,請確保您不要將任何關鍵任務代碼放在上面,也不要以爲它會一直按照您的計劃開火。我不確定它是否已在Chrome中實現,但瀏覽器可以在頁面位於後臺選項卡時優化資源使用情況,並可能最終以更大的時間間隔呼叫您的定時器。 – DarthJDG 2011-05-17 08:32:26