当前位置: 首页 > 面试题库 >

setTimeout()没有等待

沈实
2023-03-14
问题内容

我正在尝试用Java倒计时。

这是我的HTML

<div id="ban_container" class="error center">Please wait
        <span id="ban_countdown" style="font-weight:bold">
        45</span>
        seconds before trying again
</div>

而我的JS:

<script type="text/javascript">
    var seconds = <?php echo $user->getBlockExpiryRemaining(); ?>;

    function countdown(element) {
        var el = document.getElementById(element);

        if (seconds === 0) {
            document.getElementById("ban_container").innerHTML = "done";
            return;
        }
        else {
            el.innerHTML = seconds;
            seconds--;
            setTimeout(countdown(element), 1000);
        }
    }

    countdown('ban_countdown');
</script>

但是由于某种原因,它不会等待超时时间,而是立即执行countdown,以便在刷新页面时立即显示“完成”。我知道它实际上被执行了多次,因为如果我这样做,innerHTML += seconds + " ";它会从45开始递减计数。为什么会绕过超时?


问题答案:

setTimeout(countdown(element), 1000);执行带有该参数的函数,并将结果传递给setTimeout。你不要那样

相反,执行一个匿名函数来调用您的函数:

setTimeout(function() {
    countdown(el);  // You used `el`, not `element`?
}, 1000);


 类似资料:
  • 尝试学习Async/await(以下代码),等待在2s后返回用户名。(返回一个promise)然后只记录接收到的用户名。 问题是then方法中的记录了。 不确定这里出了什么问题。很感谢解释一下这里到底发生了什么。 多谢了。

  • 问题内容: 考虑以下示例: 是什么导致该执行 立即 ,而不是等待3秒为单位设置,以及只执行警戒 ONCE ,而不是在计划每隔5秒? 感谢您的任何帮助,您可以提供! 石匠 问题答案: 这看起来不像立即调用函数吗? 尝试传递函数(不执行):

  • 我是ES6新手,所以我学习Javascript语句。 在测试async/await时,我发现了一些奇怪的行为。 我这样写代码, 输出在这里, 我定义async来运行,并等待每一行同步工作。 预期产量在这里, 谢谢。

  • 问题内容: 我正在尝试使用新的异步功能,希望解决我的问题以后能对其他人有所帮助。这是我的代码正在工作: 问题是,我的while循环运行得太快,脚本每秒向Google API发送太多请求。因此,我想构建一个睡眠函数以延迟请求。因此,我也可以使用此功能来延迟其他请求。如果还有其他方法可以延迟请求,请告诉我。 无论如何,这是我的新代码不起作用。请求的响应在setTimeout中返回给匿名异步函数,但是我

  • 我对Java线程和并发有点陌生。我读过关于同步和锁定块的书。它们让其他线程等待第一个线程完成其工作。 我只想知道一种方式,如果线程a正在执行它的执行,那么线程B不应该等待并跳过共享代码块的执行。

  • 问题内容: 我需要实现在单击按钮60秒后才能运行的功能。请帮助,我使用了Timer类,但是我认为这不是最好的方法。 问题答案: “我使用了Timer类,但是我认为那不是最好的方法。” 其他答案假定您未在用户界面(按钮)上使用Swing。 如果您正在使用Swing,请 不要 使用它,因为它将冻结您的Swing应用程序。 相反,您应该使用。 有关更多信息和示例,请参见Java教程如何使用Swing计时