我试图循环一些值,这些值是毫秒。我需要每xxxx秒运行一些代码,具体取决于他从循环中获得的值,但我无法使其工作,它可以工作,但它不能按时运行。
代码包含一个重置按钮(代码来自插件,但我必须修改它)
//插件选项
step:[
{
time: 6000,
// more stuff here
// but we dont need
// it in this example
},
{
time: 3000,
// more stuff here
// but we dont need
// it in this example
},
{
time: 12000,
// more stuff here
// but we dont need
// it in this example
}
]
//循环
var timeouts = [];
$.each(options.step, function(i, value){
var time = value.time;
timeouts.push(setTimeout(function(){
alert('some action');
},time*i));
});
//重置按钮
$('.stop').click(function(){
$.each(timeouts, function (_, id) {
clearTimeout(id);
});
timeouts = [];
})
答案 0 :(得分:0)
我的主要猜测是你没有设置所需的计时器时间。您使用i * value.time
作为计时器时间,这似乎很奇怪。你是否意识到i
是你的数组的索引,所以它第一次为零,然后是1,然后是2等......
这会导致计时器时间:0*6000, 1*3000, 2*12000
转换为0, 3000, 24000
。
这似乎不像你想要的那样。
此外,浏览器中的Javascript是单线程的(除了webWorkers和一些事件副作用,这不是我们在这里讨论的)。因此,setTimeout()
不能保证准确。如果在定时器事件触发时正在运行其他东西,那么该定时器事件将进入事件队列,并将在Javascript执行的当前线程结束时运行。因此,setTimeout()
如果在其发生时正在运行其他内容,则不会按时运行。
答案 1 :(得分:0)
您设置的间隔为0秒(6000 * 0),3秒(3000 * 1)和24秒(24000 * 2)。这是因为您乘以索引(i
)。这是你想要达到的时间间隔吗?
答案 2 :(得分:0)
time*i
- 这可能是你的问题。
以您提供的数据为例,您将获得以下时间:6000
,3000
,12000
。
让这些乘以i
,您将获得0
,3000
,24000
。
编辑: 正如下面的评论所示,您希望第一个值始终为零,并将结果值保留原样。
将超时延迟设置为i == 0 ? 0 : time
可行。
这基本上意味着expression ? true : false;
以下是一个示例:http://jsfiddle.net/2ka9g/1/