【问题标题】:clearTimeout not working in recursion function - javascriptclearTimeout 在递归函数中不起作用 - javascript
【发布时间】:2014-02-12 08:54:52
【问题描述】:

这是我正在使用的代码。当 ticks 等于 5 时,递归函数应该停止清除 mainThread 超时。有人请帮忙。

var mainThread;  
var ticks = 0;  
function tickTimer() {  
    clearTimeout(mainThread);  
    if (ticks >= 5) {  
        endGame();  
    }  
    else {  
        mainThread = setTimeout(function () {  
            ticks++;  
            tickTimer();  
        }, 1000);  
    }  
}  

如果有任何问题,请告诉我。 提前谢谢你。

【问题讨论】:

  • 您正在减少ticks 的值,但如果该值大于或等于 5,游戏将结束。
  • 正如@UweB 提到的,if 条件不应该是if ( ticks == 5 ) { endGame(); },因为(ticks >= 5) 将始终返回true?
  • 考虑使用setInterval,而不是重复调用setTimeout

标签: javascript settimeout cleartimeout


【解决方案1】:

试试这个:

function tickTimer() {       
    if (++ticks >= 5)  {
        clearInterval (mainThread); 
        endGame();  
    }  
} 

var  mainThread = setInterval(tickTimer, 1000);
var ticks = 0;

【讨论】:

    【解决方案2】:
    you can try this. all you need to do is clear interval every time tickTimer function is called.
    
    var  mainThread = setInterval(tickTimer, 1000);
    var ticks = 0;
    
    function tickTimer() {       
        if (++ticks >= 5)  {
            clearInterval (mainThread); 
            endGame();  
        }  
    } 
    

    【讨论】:

    • 太棒了!壳。有效。 BTW loxxy 给出了相同类型的答案。并且正在工作。
    • @sheelpriy 将您的见解添加到某人的答案中非常棒。但是,如果有的话,请始终努力给予学分。
    【解决方案3】:

    你声明了mainThread 吗?像这样

    var mainThread = null;
    function tickTimer() {  
        clearTimeout(mainThread);
        mainThread = null;  
        if (ticks >= 5) {  
            endGame();  
        }  
        else {  
            mainThread = setTimeout(function () {  
                ticks++;  
                tickTimer();  
            }, 1000);  
        }  
    }
    

    ticks++ 不是ticks--

    【讨论】:

      【解决方案4】:

      请尝试将ticks--替换为ticks++

      【讨论】:

        【解决方案5】:

        我认为只是将您的计时器作为参数发送

        function tickTimer(timer) {  
            timer && clearTimeout(timer);  
            if (ticks >= 5) {  
                endGame();  
            }  
            else {  
                var timer = setTimeout(function () {  
                    ticks--;  
                    tickTimer(timer);  
                }, 1000);  
            }  
        }  
        

        不要使用全局范围)))

        【讨论】:

          【解决方案6】:

          我认为你应该在函数被触发时初始化变量刻度。

          【讨论】:

            猜你喜欢
            • 2020-07-26
            • 2021-02-12
            • 2014-04-03
            • 1970-01-01
            • 2021-08-14
            • 1970-01-01
            • 1970-01-01
            • 2018-07-14
            相关资源
            最近更新 更多