在for循环中使用setInterval?

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

我想使用setInterval函数,使得这个过程总共需要一分钟的时间,不管列表中有多少项。如果有10个项目,它将每6秒触发一次,30个项目每2秒触发一次,以此类推。

感谢您的帮助!


你能提供一些背景信息,说明你想要实现什么吗?如果要确切地控制在一分钟内完成,这将完全取决于每次迭代所需执行的操作以及单个迭代需要多长时间,这可能非常难以实现。 - Gerry
1
请确保不要在其中放置任何关键任务代码,并且不要假设它将始终按照您计划的方式触发。我不确定它是否已经在Chrome中实现,但是当您的页面位于后台选项卡上时,浏览器可以优化资源使用情况,并可能以更大的间隔调用您的定时器。 - DarthJDG
4个回答

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演示

我不确定这是否符合您的要求,但是在给定时间范围内,此解决方案将“迭代”列表中的所有项目,而不使用for循环。该函数始终使用setTimeout“调用自身”。超时在开始时基于项目数量计算。

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


1分钟等于60000毫秒。 - mplungjan
@mplungjan 是的,这只是用于测试的值 :). 忘记改回去了,谢谢。 - kapa
1
你可以将迭代状态变量放入闭包中,以避免使用全局变量。你不想像我在Ocamel中所做的那样。 :) - DarthJDG
@DarthJDG :哈哈,那是肯定的:)。我只是想给一个快速的例子(或者我假设所有这些代码都会放在一个函数中)。 - kapa

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

2
警告是一种阻塞指令。我也纠正了你的拼写。 - mplungjan

-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
1
将立即执行该函数。请参见[jsFiddle](http://jsfiddle.net/RFw8A/)。`setTimeout`要么期望一个函数,要么期望一个字符串(不建议使用字符串,这类似于`eval`)作为第一个参数。您正在调用一个函数而不是将函数作为参数传递,因此除非`code()`返回一个函数,否则这将无法工作。 - kapa
有趣的是,当我完成时间分割逻辑后,我想:“吹毛求疵的人会批评我,因为他们会认为代码没有返回闭包,而且这只是我纯粹的无知。” - Novikov
我是其中一位“吹毛求疵”的人。如果我看到不好的代码示例,我会投下反对票,并在评论中指出代码存在的问题。如果回答得到纠正,我会撤销我的反对票(就像我在这里所做的那样)。这并不是出于个人原因,而是因为一个不好的代码示例不会对问题的提出者有所帮助。 - kapa

-2
尝试类似以下的代码:
var interval = 2;
for (var i=list.length; i>=0; i--){
    setTimeout(your_code_here(), i*interval);
}

1
这样做是行不通的,因为你立即执行了函数。从你的代码中删除() - 同时你在x*2毫秒内执行了它。 - mplungjan
回复@i100的帖子:我认为这不会起作用:var interval = 2; for (var i=list.length; i>=0; i--){ setTimeout(your_code_here(), i*interval); } 当“your_code_here()”等待执行时,循环仍在继续。而且循环将在非常短的时间内完成(可能是1毫秒或更短,取决于您的CPU)... - Yuankun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接