Javascript setTimeout期间阻止函数执行

Javascript setTimeout期间阻止函数执行,javascript,settimeout,Javascript,Settimeout,我有一个当我按下按钮时调用的函数。我的目标是在5秒钟后在控制台上打印“hello”,如果我在等待的5秒钟内按下按钮,什么也没有 问题是,如果我在等待5秒钟的时候按下按钮,在控制台中我仍然会收到不止一个“hello”。我做错了什么 以下是Javascript代码: function foo(){ var block = false; if(!block){ block = true; myVar = setTimeout(checkAgain, 50

我有一个当我按下按钮时调用的函数。我的目标是在5秒钟后在控制台上打印“hello”,如果我在等待的5秒钟内按下按钮,什么也没有

问题是,如果我在等待5秒钟的时候按下按钮,在控制台中我仍然会收到不止一个“hello”。我做错了什么

以下是Javascript代码:

function foo(){
    var block = false;
    if(!block){
        block = true;
        myVar = setTimeout(checkAgain, 5000);
    }
    function checkAgain(){
        console.log("hello");
        block = false;
    }
}
以及HTML:

<button id="button" onClick="foo();">Click me!</button>
点击我!

您没有采取任何措施阻止后续呼叫
block
foo
内部的局部变量,因此对
foo
的每次调用都有一个不同的变量

相反,您必须在
foo
外部设置
block

var-myVar;
var block=false;
函数foo(){
如果(!块){
block=true;
myVar=setTimeout(再次检查,5000);
}
函数checkreach(){
console.log(“你好”);
block=false;
}
}
document.getElementById(“btn”).addEventListener(“单击”,foo)

这是因为您在函数“foo”的范围内定义了变量“block”,并且每次调用该函数时都会再次启动该变量。正确的实施方式是:

var block = false;

function foo(){
  if (!block) {
    block = true;
    myVar = setTimeout(checkAgain, 5000);
  }

  function checkAgain() {
    console.log("hello");
    block = false;
  }
}

您不需要手动处理“阻塞”,只需使用
clearTimeout
取消调用即可。这对我来说似乎更自然——当你点击一次,你说“在5秒钟内调用这个函数”,当你再次点击它,你说“不要调用它”

var timeout=null;
var按钮=document.querySelector(“#btn”);
button.onclick=函数()
{
如果(超时)
{
clearTimeout(超时);
超时=空;
}
其他的
{
timeout=setTimeout(函数(){
超时=空;
run();
},1000);//应为5000,仅用于测试
}
};
函数运行()
{  
log(“你好世界”);
}

您的
是一个局部变量,而不是上述作用域中的全局变量。
是一个局部变量,因此它在开始时总是为false。如果您使用的是lodash,那么后面的调用看起来像是您正在尝试的。这是一个有趣的解决方案,我没有想到它