Javascript setTimeout函数开始执行的次数太多
我用setTimeout函数创建了一个循环,在第二步或第三步调用它本身后出现问题,因为它开始执行两次。这就是我的函数的外观:Javascript setTimeout函数开始执行的次数太多,javascript,settimeout,intervals,Javascript,Settimeout,Intervals,我用setTimeout函数创建了一个循环,在第二步或第三步调用它本身后出现问题,因为它开始执行两次。这就是我的函数的外观: var value = 70, intervalID = null; function interval() { intervalID = setTimeout(countDown, 1000); } function countDown() { value--; if(value > 0) { clearTimeout(inter
var value = 70,
intervalID = null;
function interval() {
intervalID = setTimeout(countDown, 1000);
}
function countDown() {
value--;
if(value > 0) {
clearTimeout(intervalID);
interval();
} else {
endInterval();
}
}
function endInterval() {
// do something
}
如果我控制台变量值为69、68,然后在一个函数调用中开始两次减小变量值。我不是在任何地方调用函数countDown(),而是在一个地方调用
有什么问题吗
编辑:此代码现在可以工作。我建议您通过停止前一个超时来“清理”超时
function interval() {
clearTimeout(intervalID);
intervalID = setTimeout(countDown, 1000);
}
然而,这看起来像是对症状的控制,而不是对疾病原因的控制。所以最好检测问题的原因。对我来说很好-你确定没有调用初始函数两次吗?实际上,你没有在代码中编写一个循环,或者创建了“超时循环”?我每次调用它时都必须清除超时,它才开始工作。谢谢你的酒。超时不需要从它自己的回调函数中清除。我发现html中有两个dom元素具有相同的类,所以这就是为什么所有内容都开始执行两次。@Bergi,你是对的,但是当你为全局变量分配超时ID时,你永远不知道是否执行了分配给该变量的前一个超时。我认为它违反了完整性,因为我们可以依赖intervalID变量。OP的原始解决方案没有使用timeoutID。是的,对于这样的任务,您永远不应该使用全局变量,而应该使用封闭变量。此外,如果您希望覆盖timeoutID并希望清除以前的,则需要在覆盖它之前执行此操作。当以前的方法执行时,您的方法仅清除“最新”分配的方法。