Javascript 在for循环上设置间隔?

Javascript 在for循环上设置间隔?,javascript,jquery,Javascript,Jquery,我想使用setInterval使此过程花费1整分钟,无论列表中有多少项。所以如果有10个项目,它会每6秒触发一次,30个项目,每2秒触发一次,等等 谢谢你的帮助 你会的 for (var i=list.length; i>=0; i--){ //do something.... } 请尝试以下操作: function code(i) { return function() { alert(i); }; } var period

我想使用setInterval使此过程花费1整分钟,无论列表中有多少项。所以如果有10个项目,它会每6秒触发一次,30个项目,每2秒触发一次,等等

谢谢你的帮助

你会的

for (var i=list.length; i>=0; i--){
    //do something....                      
}

请尝试以下操作:

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));
}

可以这样做:

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

我不确定这是否是您想要的,但这将在给定的时间范围内“迭代”列表中的所有项目,而不使用
for
循环。该函数将始终使用
setTimeout
来“调用自身”。超时在开始时根据项目数计算


此解决方案比
setInterval
更“可靠”。下一个超时将在上一个操作已经完成时设置,因此它不会叠加。

您能提供一些您试图完成的操作的背景信息吗?只需要一分钟,这完全取决于你每次迭代都在做什么,以及一次迭代需要多长时间,这可能很难实现。还要确保你没有在上面放任何关键任务代码,也不要假设它总是按照你的计划启动。我不确定它是否已经在Chrome中实现,但是当你的页面位于后台选项卡上时,浏览器可以优化资源使用,并且可能会以更大的间隔调用你的计时器。
setInterval
s的第一个参数应该是函数,第二个参数是延迟。将毫不延迟地执行该函数。看
setTimeout
期望函数或字符串(不建议使用,它类似于
eval
)作为第一个参数。您正在调用函数而不是将函数作为参数,因此除非
code()
返回一个函数,否则这将不起作用。有趣的是,当我完成对自己思考的时分逻辑时“吹毛求疵的人会把我难住,因为他们会认为代码不会返回闭包,这完全是出于我的无知。”我是“吹毛求疵者”之一。如果我看到一个糟糕的代码示例,我会投反对票,并对代码中的问题留下评论。如果答案得到纠正,我会删除我的反对票(就像我在这里做的那样)。这不是针对个人的,但一个糟糕的代码示例对操作没有帮助。警报是一个阻止指令。我已将您的拼写改为1分钟为60000milliseconds@mplungjan是的,刚刚有这个测试值:)。忘了把它改回去了,谢谢。你可以把你的迭代状态变量放进一个闭包中,以避免使用全局变量。你不想这样做我在Ocamel中所做的。:@DarthJDG:D这是肯定的:)。我只是想给出一个简单的示例(或者我假设所有这些代码都将进入一个函数)。这不起作用,因为您立即执行该函数。请删除()通过@i100发表评论:我认为这行不通:var interval=2;for(var I=list.length;I>=0;I--{setTimeout(你的_-code_-here(),I*interval);}当“你的_-code_-here()正在等待执行,循环仍在继续。循环将在很短的时间内完成(可能是1ms或更短,取决于您的cpu)。。。
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);
})();
var totalItem = list.length;
setInterval(function(){ alert('');}, 60000/totalItem);