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

JavaScript 中有睡眠功能吗?

【问题讨论】:

标签: javascript


【解决方案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】:

您可以使用setTimeout 或setInterval 函数。

【讨论】:

  • Sleep 是同步的,而 setTimeout 是异步的,因此随意使用这些实现可能会造成一些混淆。
  • 可能会造成混淆,但很少有人想要真正阻止整个程序中的所有计算。对于初学者来说,问题通常是“我如何暂停这个单独的功能一点?”以我的经验,所以答案是await 与setTimeout() 的承诺:masteringjs.io/tutorials/fundamentals/sleep
猜你喜欢
  • 2011-04-08
  • 2011-12-12
  • 2023-03-29
  • 2019-10-21
  • 1970-01-01
  • 2018-01-19
  • 2011-02-03
  • 2010-11-19
  • 2021-04-12
相关资源
最近更新 更多