Javascript setTimeout期间阻止函数执行
我有一个当我按下按钮时调用的函数。我的目标是在5秒钟后在控制台上打印“hello”,如果我在等待的5秒钟内按下按钮,什么也没有 问题是,如果我在等待5秒钟的时候按下按钮,在控制台中我仍然会收到不止一个“hello”。我做错了什么 以下是Javascript代码: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
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,那么后面的调用看起来像是您正在尝试的。这是一个有趣的解决方案,我没有想到它