【问题标题】:Clearing Timeout After Button Clicked单击按钮后清除超时
【发布时间】:2019-12-17 04:11:54
【问题描述】:

我目前正在尝试编写类似于电子宠物“护理错误”的代码。

在这种情况下,我正在尝试创建一个函数来检查对象的饥饿状态是否高于或等于 10。一旦发生这种情况,计时器将启动,如果 10 秒后仍保持在 10 以上,它将被记录为“错误”。

但是,如果用户执行了另一个将饥饿值降低到 10 以下的操作,它将清除计时器。

尽管尝试了下面的代码,但我目前无法正确清除计时器。

var changeHungerMood = setInterval(mistakeCheck, 5000);

function mistakeCheck() {
    var mistakeTimer
    function addMistake() {
        stats.mistakes += 1;
    }
    if (stats.hunger >= 10) {
        var mistakeTimer = setTimeout(addMistake, 10000);
    } else {
        clearTimeout(mistakeTimer);
        console.log("Mistake Cleared!");
    }
}


minmaxHunger("hunger", 10, 0);

目前,即使在检查后饥饿值低于 10,计时器也不会被清除,它仍然会被记录为错误。有人可以帮忙吗?谢谢。

【问题讨论】:

  • 每次调用errorCheck 时,您都在重新定义errorTimer。我相信这就是你的问题所在。因此,当您运行 clearTimeout(mistakeTimer) 时,它与启动倒计时的 Timer 不同。

标签: javascript function timeout


【解决方案1】:

您应该明确在每种情况下您需要完成什么。 非常迫切地,您需要:

  1. 如果stats.hunger >= 10 设置你的计时器,你做得很好(除了你用var 声明mistakeTimer 两次...跳过第二次var)。
  2. 当 10 秒结束时,您需要检查 stats.hunger 是否仍为 10 或更多,而不是调用 addMistake,如果是,请调用您的 addMistake 函数。

因此,您需要添加一个函数addMistakeIfNeeded 进行检查并在需要时调用addMistake。你的计时器应该调用这个addMistakeIfNeeded函数而不是addMistake

@Jonas 是对的,您需要将 addMistakeaddMistakeIfNeeded 排除在 mistakeCheck 函数之外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多