JavaScript中是否有睡眠功能?

use*_*324 188 javascript

JavaScript中是否有睡眠功能?

Sol*_*ogi 306

如果你想通过调用来阻止代码的执行sleep,那么没有,没有方法可以实现JavaScript.

JavaScript确实有setTimeout方法.setTimeout将允许您将函数的执行延迟 x毫秒.

setTimeout(myFunction, 3000);

// if you have defined a function named myFunction 
// it will run after 3 seconds (3000 milliseconds)
Run Code Online (Sandbox Code Playgroud)

请记住,这与sleep方法(如果存在)的行为方式完全不同.

function test1()
{    
    // let's say JavaScript did have a sleep function..
    // sleep for 3 seconds
    sleep(3000);

    alert('hi'); 
}
Run Code Online (Sandbox Code Playgroud)

如果运行上述功能,sleep则在看到警报"hi"之前,您必须等待3秒钟(方法调用阻止).不幸的是,没有这样的sleep功能JavaScript.

function test2()
{
    // defer the execution of anonymous function for 
    // 3 seconds and go to next line of code.
    setTimeout(function(){ 

        alert('hello');
    }, 3000);  

    alert('hi');
}
Run Code Online (Sandbox Code Playgroud)

如果你运行test2,你会立即看到'hi'(setTimeout非阻塞),3秒后你会看到警告'hello'.

  • 会增加几点.分配给setTimeout的函数将放入事件队列中.JavaScript本质上是单线程的.如果队列中至少有一个事件有资格"触发"(如4000ms前设置的3000ms超时),"javascript VM"将选择一个并调用其处理程序(函数回调).关键是实际调用不太可能是你提出请求时(比如说3000毫秒之后),它可能是3001,3002甚至很晚,具体取决于队列中其他事件的数量和性质,以及他们的回调. (5认同)
  • 与此同时,您可以简单地使用 [`await sleep(3000)`](http://stackoverflow.com/questions/951021/what-is-the-javascript-version-of-sleep/39914235#39914235)。 (2认同)

And*_*eda 82

您可以使用setTimeoutsetInterval功能.

  • 睡眠是同步的,并且setTimeout是异步的,因此可能会有一些混乱,随意使用这些实现. (55认同)
  • 可能会造成混乱,但很少有人想要真正阻止整个程序中的所有计算。对于初学者来说,问题通常是“如何暂停这个单独的功能一会儿?” 根据我的经验,所以答案是“await”与“setTimeout()”的承诺:https://masteringjs.io/tutorials/fundamentals/sleep (3认同)

小智 77

如果运行上述功能,则必须等待3秒钟(睡眠方法调用阻塞)

/**
* Delay for a number of milliseconds
*/
function sleep(delay) {
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常糟糕的主意.为了善良,请不要使用此代码. (83认同)
  • JS没有错,它完全符合要求.如果你说这是一个糟糕的生产实践,那么这将是有效的,但是轻浮和对抗只是我想的一些人的方式.**这对于某些调试和测试场景非常有用,并且实际上回答了所提出的问题.**问题是**不是**"执行某些延迟的最佳做法是什么?" (39认同)
  • @TomWijsman实际上,这是一个真实的,很好的阻塞睡眠;)我认为没有理由使用它,但它比setTimeout或setInterval更好的睡眠,因为它们不像睡眠一样阻止执行. (15认同)
  • 可惜它会触发cpu竞赛直到它返回,但对于短暂的睡眠并不是一件大事,更大的遗憾是javascript不能以非cpu密集的方式提供这个. (7认同)
  • 这会浪费电池,并阻止JS在整个页面中执行.一个非常糟糕的主意. (6认同)
  • 就我而言,@ Izkata"糟糕的做法"=="非常糟糕"在语义上.你没有说过别人还没说过的话.您所说的所有内容都是适合包含在评论中的重要信息,但它们都不会使答案不正确.代码是正确的.它按预期运作.是的,预期的行为是不可取的,但它仍然按预期运行,因此代码虽然是不好的做法,但是正确的.在被问到的问题的背景下,它不值得投票. (5认同)
  • 最后有人可以写出如何使用sleep函数(不是花哨的setTimeout函数).如果我只是想调试一下,我真的不在乎这是不好的做法. (2认同)
  • @Izkata有时暂停整个浏览器进程对于调试很有用。请求和 Web 堆栈不仅仅是客户端浏览器。 (2认同)

Sha*_*lab 44

function sleep(delay) {
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay);
}
Run Code Online (Sandbox Code Playgroud)

此代码阻止指定的持续时间.这是CPU占用代码.这不同于线程阻塞自身并释放CPU周期以供另一个线程使用.这里没有这样的事情发生.不要使用这段代码,这是一个非常糟糕的主意.

  • 也不要做while(1){}.另一个很糟糕的主意.我有很多非常糟糕的想法,我很乐意根据要求分享. (2认同)
  • 哈哈哈这个答案的最后一句话 (2认同)