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】:
您可以使用setTimeout
或setInterval
函数。
【讨论】:
Sleep 是同步的,而 setTimeout 是异步的,因此随意使用这些实现可能会造成一些混淆。 可能会造成混淆,但很少有人想要真正阻止整个程序中的所有计算。对于初学者来说,问题通常是“我如何暂停这个单独的功能一点?”以我的经验,所以答案是await
与setTimeout()
的承诺:masteringjs.io/tutorials/fundamentals/sleep以上是关于JavaScript中有睡眠功能吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章