[英]stop settimeout in recursive function
我的问题是我无法停止计时器。
我有这个方法来设置这个论坛的超时。 它应该将标识符存储在全局变量中。 我意外地发现,在我隐藏“mydiv”之后它仍在运行。
我现在还需要知道,如果递归函数创建多个实例,或者仅为超时创建一个实例。 因为首先我认为它每次都会覆盖“var mytimer”。 现在我不太确定。
什么是一个可靠的方法来停止计时器?
var updatetimer= function () {
//do stuff
setTimeout(function (){updatetimer();}, 10000);
}//end function
//this should start and stop the timer
$("#mybutton").click(function(e) {
e.preventDefault();
if($('#mydiv').is(':visible')){
$('#mydiv').fadeOut('normal');
clearTimeout(updatetimer);
}else{
$('#mydiv').fadeIn('normal');
updatetimer();
}
});
谢谢,理查德
我认为大多数人都在理解为什么这不起作用,但我想我会为你提供更新的代码。 它与您的几乎完全相同,只是它将超时分配给变量以便可以清除它。
此外,setTimeout中的匿名函数很棒, 如果要运行逻辑内联,更改函数内部的'this'值,或将参数传递给函数 。 如果您只想调用一个函数,只需将函数名称作为第一个参数传递即可。
var timer = null;
var updatetimer = function () {
//do stuff
// By the way, can just pass in the function name instead of an anonymous
// function unless if you want to pass parameters or change the value of 'this'
timer = setTimeout(updatetimer, 10000);
};
//this should start and stop the timer
$("#mybutton").click(function(e) {
e.preventDefault();
if($('#mydiv').is(':visible')){
$('#mydiv').fadeOut('normal');
clearTimeout(timer); // Since the timeout is assigned to a variable, we can successfully clear it now
} else{
$('#mydiv').fadeIn('normal');
updatetimer();
}
});
我认为你误解了'setTimeout'和'clearTimeout'。
如果要设置要在以后取消的计时器,请执行以下操作:
foo = setTimeout(function, time);
然后打电话
clearTimeout(foo);
如果你想取消那个计时器。
希望这可以帮助!
由于编写的mytimer是一个永远不具有超时标识符值的函数,因此您的clearTimeout语句将无法实现。
我根本没有看到任何递归,但你需要存储值setTimeout返回给你,如果你需要将它与多个潜在事件配对,你需要将它存储在一个你可以查找的键值上 - 就像一个元素或许也许?
你不能停止所有创建的函数,将函数转换为setInterval(表示与递归函数相同的逻辑)并将其停止:
// recursive
var timer= function () {
// do stuff
setTimeout(function (){timer();}, 10000);
}
使用setInterval的相同逻辑:
// same logic executing stuff in 10 seconds loop
var timer = setInterval(function(){// do stuff}, 10000)
停下来:
clearInterval(timer);
这是一个简单的伪代码,用于控制和调节递归的setTimeout函数。
const myVar = setTimeout(function myIdentifier() {
// some code
if (condition) {
clearTimeout(myIdentifier)
} else {
setTimeout(myIdentifier, delay); //delay is a value in ms.
}
}, delay);
(功能(){
$('#my_div').css('background-color', 'red');
$('#my_div').hover(function(){
var id=setTimeout(function() {
$('#my_div').css('background-color', 'green');
}, 2000);
var id=setTimeout(function() {
$('#my_div').css('background-color', 'blue');
}, 4000);
var id=setTimeout(function() {
$('#my_div').css('background-color', 'pink');
}, 6000);
})
$("#my_div").click(function(){
clearTimeout(id);
})
})();
正如上面提到的,为什么这个代码不工作的主要原因是,你passingt他做错事到clearTimeout
调用-你需要存储的返回值setTimeout
叫你做updateFunction
并通入clearTimeout 这一点 ,而不是函数引用本身。
作为改进的第二个建议 - 只要你有一个你称之为递归超时函数的东西,你最好使用setInterval
方法,该方法定期运行一个函数直到被取消。 这将实现与您尝试使用updateFunction
方法相同的功能,但它更干净,因为您只需要在延迟函数中包含“do stuff”逻辑,并且它可能更updateFunction
,因为您不会创建嵌套关闭。 加上它是正确的做法,它必须要有所作为,对吗? :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.