Javascript 按下togglebutton时执行超时功能

Javascript 按下togglebutton时执行超时功能,javascript,timeout,do-while,togglebutton,Javascript,Timeout,Do While,Togglebutton,我想运行一个超时为2000毫秒的函数。该函数应该在按下切换按钮时运行 当我运行此函数时,我的CPU会爆炸: do { setTimeout(function () { me.pushMockData(); }, 2000); } while (liveButton.getPressed() != false); 这是因为您一直在while循环中调用setTimeout函数 var timeout; if (liveButton.getPressed()) { if (

我想运行一个超时为2000毫秒的函数。该函数应该在按下
切换按钮时运行

当我运行此函数时,我的CPU会爆炸:

do {
  setTimeout(function () {
    me.pushMockData();
  }, 2000);
}
while (liveButton.getPressed() != false);

这是因为您一直在while循环中调用
setTimeout
函数

var timeout;

if (liveButton.getPressed())
{
    if (typeof timeout !== 'undefined') {
        timeout = setTimeout(function () {
                      me.pushMockData();
                  }, 2000);
    } else {
        clearTimeout(timeout);
    }

}

你完全搞错了,保持简单,在按钮上附加一个事件监听器,然后调用setTimeout

HTML

<button id="my_button">Click Me</button>
JSFiddle


按下按钮时,您的CPU会爆炸,因为您在循环中一次又一次地创建超时,速度非常快。如果要每2秒钟运行一次函数:

  • 你应该测试一下按钮是否被按下
  • 使用
    setInterval
  • setInterval
    内,检查按钮是否仍被按下,如果未按下,
    clearInterval


如果您只想在2秒钟后激活功能,请在If中使用
setTimeout

如果您可以捕获onPress和onRelease事件,最好执行以下操作

onPress
var myTimeout = setTimeout( ... , 2000 )

onRelease
clearTimeout(myTimeout)

示例:

为什么要使用do/while循环?只需在超时功能中选中
getPressed
。否则,您将创建一个非常大的超时函数堆栈。当按下超时函数时,您能捕获该事件吗?如果是这样,在“onPress”事件之后设置新的超时,并在“onRelease”事件上清除它(使用clearTimeout)。是的,这样更好,你是对的。。但这并不能解决问题。我的CPU像以前一样爆炸了。我想,超时时间不太合适。它在没有2秒超时的情况下连续启动pushMockData函数。@MarvinRügheimer我添加了一个示例,如果您不介意检查的话。我看到您找到了解决方案,但无论如何,我希望它会有所帮助使用
setInterval
似乎是个坏主意,因为它有加速的趋势。另外,如果可以使用
setTimeout
的话,似乎要做更多的工作。你的意思是:setInterval(函数(){if(liveButton.getPressed()!=false){me.pushMockData();}else{clearInterval();},2000);可能是这样的:
var interval=setInterval(函数(){if(liveButton.getPressed()!=false){me.pushMockData();}else{clearInterval(interval);},2000)
在liveButton的onclick侦听器中,仅当您需要每2秒运行一次代码时,如果不需要,请在if语句中使用setTimeoout。不客气:)请尝试澄清您的问题,因为不清楚您是否需要每2秒运行一次,我想使用代码^^^会更好,谢谢。但是,在再次按下按钮之前,如何运行超时功能?
onPress
var myTimeout = setTimeout( ... , 2000 )

onRelease
clearTimeout(myTimeout)