clearInterval并在x秒后再次设置它

时间:2016-08-19 21:00:21

标签: javascript

我想与if进行简单的间隔,它正在检查变量的值并执行函数again()

again函数包含clearIntervali++setTimeout,以便在 again 秒后调用间隔x < / p>

    var speed = 1000;
    var wait = 0;
    var i = 0;

    function init() {
        setInterval(function() {
            if (i >= 6) i = 0;
            if (i == 4) {
                wait = 5000;
                again(wait);
            } else {
                document.body.innerHTML = i;
                i++;
            }
        }, speed);
    }

    function again(time) {
        clearInterval(init());
        i++;
        setTimeout(function() {
            setInterval(init(), speed);
        }, time);
    }
    init();

我希望输出如下:

1, 2, 3, Waiting x sec's , 5, 1, 2, ...

但代码正在做一些疯狂的事情,它越来越快。我不知道为什么。

这是一个codepen示例(可能会导致浏览器崩溃!)

你能解决它并解释一下吗?感谢

2 个答案:

答案 0 :(得分:2)

您没有清除间隔,而是使用clearInterval方法中的函数。使用的方法 init 没有return语句,因此clearInterval在属性中未定义,所以它不会清空任何内容。

固定代码:

var speed = 1000;
var wait = 0;
var i = 0;
var interval=null;

function init() {
    interval = setInterval(function() {
        if (i >= 6) i = 0;
        if (i == 4) {
            wait = 5000;
            again(wait);
        } else {
            document.body.innerHTML = i;
            i++;
        }
    }, speed);
}

function again(time) {
    clearInterval(interval);
    i++;
    setTimeout(function() {

    init()

    }, time);
}

init();

函数 setInterval 返回间隔id,函数中的函数 clearInterval 应该得到我们要停止的间隔的id,所以我创建了区间变量来保存id。我在clearInterval中使用这个变量。

答案 1 :(得分:0)

这是如何更改setInterval来电延迟的一个小例子。

(function iife() {
    var timer = null,
        counter = 0;

  function task() {
    counter += 1;
    console.log(counter);
    // condition: every four reps
    if (counter % 4 === 0) {
      console.log("changed speed to 4 seconds");
      return start(4000);
    }
    // condition: every seven reps
    if (counter % 7 === 0) {
      console.log("changed speed to 2 seconds");
      return start(2000);
    }
  }

  function start(delay) {
    clearInterval(timer);
    console.log("runs every " + delay + " miliseconds");
    timer = setInterval(task, delay);
  }

  start(1000);

}());