在每个循环中遇到settimeout问题

时间:2012-09-13 01:49:24

标签: javascript jquery settimeout each

我试图循环一些值,这些值是毫秒。我需要每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 = [];
  })

3 个答案:

答案 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 - 这可能是你的问题。

以您提供的数据为例,您将获得以下时间:6000300012000

让这些乘以i,您将获得0300024000

编辑: 正如下面的评论所示,您希望第一个值始终为零,并将结果值保留原样。

将超时延迟设置为i == 0 ? 0 : time可行。

这基本上意味着expression ? true : false;

以下是一个示例:http://jsfiddle.net/2ka9g/1/