Javascript 在while循环中设置JS超时

Javascript 在while循环中设置JS超时,javascript,Javascript,因为setTimeout在while循环中崩溃 我不知道是否有办法做到这一点,但我正在努力使一个。 到目前为止,情况就是这样 <script> var send = true; function sendit() { alert("test"); return true; } while(true) { if(send == true) { send = false; setTimeout(function(){

因为setTimeout在while循环中崩溃

我不知道是否有办法做到这一点,但我正在努力使一个。 到目前为止,情况就是这样

<script>
var send = true;
function sendit()
{
    alert("test");
    return true;
}
while(true)
{
    if(send == true)
    {
        send = false;
        setTimeout(function(){
            if(sendit() == true) {
                send = true;
            }
        }, 5000);
    }
}
</script>

var send=true;
函数sendit()
{
警报(“测试”);
返回true;
}
while(true)
{
if(send==true)
{
发送=假;
setTimeout(函数(){
if(sendit()==true){
发送=真;
}
}, 5000);
}
}

有可能是这样吗?

我的理解是,您试图做的事情相当于Java或C语言中的
Thread.sleep(5000)
。JavaScript中不存在该功能。如果您想在函数执行后的一段时间内执行某项操作,请将其置于超时状态,但无论如何,第一个函数仍将在同一帧内完成,除非您执行大量的工作


目前,您的代码正在
sendit()
上设置一个超时时间,在它返回之前,这个时间实际上是无限的。由于JavaScript是单线程的,即使过了20秒,它仍然无法完成您的函数,也无法开始查找需要处理的超时。您应该做的是将超时的内部设置为另一个超时,并移除封装的
while(true)
。这可以允许无限的、周期性的行为,正如我认为您正在寻找的那样。

您还没有解释您希望代码做什么。如果您希望它每5秒发出一次“测试”警报,则需要:

<script>
function sendit()
{
    alert("test");
    // Call sendit() the next time, repeating
    setTimeout(sendit, 5000);
}
// Call sendit() the first time
setTimeout(sendit, 5000);
</script>

函数sendit()
{
警报(“测试”);
//下次调用sendit(),重复
设置超时(sendit,5000);
}
//第一次调用sendit()
设置超时(sendit,5000);

不需要循环,只需让函数重新调度自身即可。

这可能是一个-您想解决什么问题?当您设置
send=false
时,此处的代码将立即阻塞,因为javascript是单线程的,此时它卡在
while(true)
循环中,不可能出现超时。可能的重复:@James Thorpe,哦,好吧…@IamkDenok:很可能你只是在寻找setInterval()/clearInterval()来实现你想要的目标。但很难说,因为我们不知道您希望在原始代码中实现什么。如果上面链接的答案(由Anand提供)不能解决您的问题,您可能想问一个不同的问题,解释您首先想要实现的目标。@Ma3x setInterval()是我想要的,setInterval()基本上是一个while循环中的setTimeout,谢谢!这就是我想要的,我还发现setInterval()会存档效果。几乎是的。setInterval()将允许
sendit()
函数重叠(如果它们需要很长时间),而上面的代码将等待
sendit()
完成,然后再等待5秒钟。最好这样说,因为JS是单线程的,如果将setInterval与比指定时间间隔更长的函数一起使用,则会立即逐个调用函数(可能会冻结浏览器)。在这种情况下,调用setTimeout/setTimeout更好。但是,如果函数执行时间小于间隔,并且调用之间需要固定延迟,则应使用setInterval。@Ma3x请注意,规范中不保证调用之间的固定延迟。很可能他们或多或少是对的,但是
setTimeout
setInterval
都只保证在开火之前有一个最短的时间。@JamesThorpe:是的,是的。两者都有最小的延迟。我的意思是不增加函数执行的延迟,如果回调需要几十毫秒才能执行,那么延迟会显著增加。