setTimeout的。停止计时器

时间:2016-01-15 12:00:04

标签: javascript

如本例中那样停止setTimout?



var i = 1;

var timerId = setTimeout(function tick() {
  if (i == 5) clearTimeout(timerId);

  i++;

  console.log("Tick");

  timerId = setTimeout(tick, 2000);
}, 2000);




我知道您可以更改此代码然后一切都会正常工作,但我想了解为什么第一个示例不起作用。



var i = 1;

var timerId = setTimeout(function tick() {
  console.log('Tick');
  
  if (i < 5) setTimeout(tick, 2000);
  
  i++;
}, 2000);
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:4)

第一个代码段继续循环,因为:

  1. 您正在使用您设置的每个新超时更改timerId。
  2. 您正在清除已经完成执行的超时(因为它已调用该函数),然后创建一个新的超时。
  3. 您应该使用setInterval()而不是setTimeout(),因为间隔会在指定的频率下无限期地重复,而超时只会在指定的时间过后执行一次。

答案 1 :(得分:3)

第一个例子不起作用,因为无论i的值如何,你总是设置超时。如果i等于5

,则添加一个return语句
var i = 1;

var timerId = setTimeout(function tick() {
  if (i == 5) {
      return;
  }

  i++;

  console.log("Tick");

  timerId = setTimeout(tick, 2000);
}, 2000);

答案 2 :(得分:0)

定时器到期后clearTimeout可以,但没有必要。

正因为如此,你的第二个代码片段优于第一个代码片段。

并且在您的第一个代码段中,即使满足if条件,也始终设置超时,并且您想要返回,

我将重新编写如下所示的功能

var i = 1;
function tick() {
  if (i == 5) {
      return;
  }
  i++;
  console.log("Tick");
  setTimeout(tick, 2000);
}

setTimeout(tick, 2000);

或使用区间为

var i = 1;
function tick() {
  if (i == 5) {
      clearInterval(timerId);
      return;
  }
  i++;
  console.log("Tick");
}

var timerId = setInterval(tick, 2000);