0

我正在尝试循环一些以毫秒为单位的值。我需要每隔 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 = [];
  })
4

3 回答 3

0

我的主要猜测是您没有设置所需的计时器时间。你正在使用i * value.time你的计时器时间,这看起来很奇怪。你是否意识到这i是你数组的索引,所以第一次它会是零,然后是 1,然后是 2,等等......

这将导致计时器时间:0*6000, 1*3000, 2*12000转换为0, 3000, 24000

这似乎不是你想要的。

此外,浏览器中的 Javascript 是单线程的(除了 webWorkers 和一些我们在这里不讨论的事件副作用)。因此,setTimeout()不能保证准确。如果在计时器事件触发时正在运行其他东西,则该计时器事件将进入事件队列,并将在当前 Javascript 执行线程完成后运行。因此setTimeout(),如果在触发时有其他东西正在运行,则不会准时运行。

于 2012-09-13T01:55:23.287 回答
0

您设置的时间间隔将为 0 秒 (6000 * 0)、3 秒 (3000 * 1) 和 24 秒 (24000 * 2)。这是因为您要乘以索引 ( i)。这是您要达到的时间间隔吗?

于 2012-09-13T01:57:59.067 回答
0

time*i- 这可能是你的问题。

以您提供的数据为例,您将获得以下时间:6000, 3000, 12000.

让我们将这些乘以i,您将得到0, 3000, 24000

编辑:正如下面评论中所建议的,您希望第一个值始终为零,并且结果值保持原样。

将超时的延迟设置为i == 0 ? 0 : time将起作用。

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

这是一个例子:http: //jsfiddle.net/2ka9g/1/

于 2012-09-13T01:58:45.377 回答