JavaScript中有睡眠功能吗? [复制]

Posted

技术标签:

【中文标题】JavaScript中有睡眠功能吗? [复制]【英文标题】:Is there a sleep function in JavaScript? [duplicate] 【发布时间】:2010-11-11 14:17:28 【问题描述】:

javascript 中有睡眠功能吗?

【问题讨论】:

现代的做法是简单地使用await sleep(<duration>) 【参考方案1】:

一种简单的、占用大量 CPU 的方法来阻止执行数毫秒:

/**
* Delay for a number of milliseconds
*/
function sleep(delay) 
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay);

【讨论】:

这是一个非常糟糕的主意。看在上帝的份上,请不要使用此代码。 这样会浪费电池,并且会阻止 JS 在整个页面中执行。一个非常糟糕的主意。 @TomWijsman 实际上,这是一个真正的、很好的阻塞睡眠;)我认为没有理由使用它,但它比 setTimeout 或 setInterval 更好的睡眠,因为它们不会像睡眠那样阻塞执行. 遗憾的是它会触发 cpu 竞赛直到它返回,但是对于不是什么大问题的短暂睡眠,更遗憾的是 javascript 没有以非 cpu 密集型方式提供这个. JS 没有错,它完全按照要求执行。如果你说这对生产来说是不好的做法,那是有道理的,但我猜有些人必须是轻率和对抗性的。 这对于某些调试和测试场景非常有用,并且实际上回答了所提出的问题。 问题是不是“什么是延迟执行某事的最佳做法?” 【参考方案2】:
function sleep(delay) 
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay);

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

【讨论】:

延迟是秒还是毫秒?谢谢。 以毫秒为单位。 也不要执行 while(1) 。另一个非常糟糕的主意。我有很多非常糟糕的想法,我很乐意应要求分享。 我想你的意思是这段代码被阻塞了。 哈哈哈这个答案的最后一句话【参考方案3】:

如果您希望通过调用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)

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

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

    alert('hi'); 

如果您运行上述函数,则必须等待 3 秒(sleep 方法调用被阻塞)才能看到警报“hi”。不幸的是,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');

如果您运行 test2,您将立即看到“hi”(setTimeout 是非阻塞的),3 秒后您将看到警报“hello”。

【讨论】:

会再补充几点。分配给 setTimeout 的函数被放入事件队列中。 JavaScript 本质上是单线程的。如果队列中至少有一个事件可以“触发”(例如 4000 毫秒前设置的 3000 毫秒超时),“javascript VM”将选择一个并调用其处理程序(函数回调)。关键是,实际调用不太可能恰好在您请求时(比如 3000 毫秒后),它可能是 3001、3002 甚至更晚,具体取决于队列中其他事件的数量和性质,以及持续时间他们的回调。 同时您可以简单地使用await sleep(3000) 谢谢。我在一个使用 JavaScript 重定向到另一个页面的 aspx 页面中使用了它,在重定向之前暂停 3 秒,以便 console.log 消息在浏览器 Web 开发人员工具中保持可见: context.Response.Write("");【参考方案4】:

您可以使用setTimeoutsetInterval 函数。

【讨论】:

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

以上是关于JavaScript中有睡眠功能吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

准确的javascript睡眠功能

有睡眠/等待吗?

我们在 JavaScript 中有更简单的三元运算符吗? [复制]

我可以使用等待而不是睡眠吗? [复制]

oppowatchfree有睡眠监测功能吗

javascript 简单的JavaScript睡眠功能