在递归函数中停止settimeout

我的问题是我无法停止计时器。

我有这种方法来设置此论坛的超时。 它应该将识别器存储在全局变量中。 无意中,我发现在我隐藏“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返回值,如果你需要将它与多个潜在事件配对,你需要将它存储在一个关键值上,你可以查找 - 就像一个元素也许吧?

链接地址: http://www.djcxy.com/p/80897.html

上一篇: stop settimeout in recursive function

下一篇: What is the difference between include and extend in Ruby?