2011-05-17 195 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