我想与if
进行简单的间隔,它正在检查变量的值并执行函数again()
。
again
函数包含clearInterval
,i++
和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示例(可能会导致浏览器崩溃!)
你能解决它并解释一下吗?感谢
答案 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);
}());