Is there a sleep function in JavaScript?
javascript中有睡眠功能吗?
- 现代的做法是简单地使用await sleep()。
如果您希望通过调用sleep来阻止代码的执行,那么不,JavaScript中没有这种方法。
JavaScript有setTimeout方法。setTimeout允许您将函数的执行延迟x毫秒。
1 2 3 4
| setTimeout(myFunction, 3000);
// if you have defined a function named myFunction
// it will run after 3 seconds (3000 milliseconds) |
记住,这与sleep方法(如果存在)的行为完全不同。
1 2 3 4 5 6 7 8
| function test1()
{
// let's say JavaScript did have a sleep function..
// sleep for 3 seconds
sleep(3000);
alert('hi');
} |
如果运行上述函数,则必须等待3秒钟(sleep方法调用被阻塞),然后才能看到警报"hi"。不幸的是,在JavaScript中没有类似的sleep功能。
1 2 3 4 5 6 7 8 9 10 11
| 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)。
您可以使用setTimeout或setInterval功能。
- 睡眠是同步的,而设置超时是异步的,因此使用这些实现可能会有一些混乱。
如果运行上述函数,则必须等待3秒钟(睡眠方法调用被阻塞)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| function myFunction(){
doSomething();
sleep(500);
doSomethingElse();
}
<html>
<head>
<script type="text/javascript">
/**
* Delay for a number of milliseconds
*/
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
</head>
<body>
Eureka!
<script type="text/javascript">
alert("Wait for 5 seconds.");
sleep(5000)
alert("5 seconds passed.");
</body>
</html> |
- 这是个非常糟糕的主意。出于善意,请不要使用此代码。
- 这会浪费电池,并阻止JS在整个页面中执行。一个非常坏的主意。
- 不正确的标签,嵌入的JS,在身体内部,同步睡眠;这个JS确实是错误的。
- @Tomwijsman实际上,这是一个真正的,很好的阻塞睡眠;)我看不出有什么理由使用它,但是它比setTimeout或setInterval更好,因为它们不像sleep那样阻塞执行。
- 这是唯一正确的答案,他没有问这是不是一个好主意,也没有问推迟执行的函数//把你的狗屎弄清楚;d
- 遗憾的是,它会引发一场CPU竞赛,直到它返回,但对于不太重要的短时间睡眠,更遗憾的是,javascript没有以非CPU密集型的方式提供这种服务。
- JS没有错,它完全按照要求执行。如果你说这是一个糟糕的生产实践,那么这是有效的,但轻率和敌对只是一些人必须的方式,我猜。这对于某些调试和测试场景非常有用,并且实际上可以回答所问的问题。问题不在于"最佳实践是什么?延迟执行某件事情?"
- 最后,一个能写出如何使用睡眠功能的人(不是一个花哨的设置超时功能)。如果我只想调试一秒钟,我真的不在乎这是不是一个坏习惯。
- @aaronls这不仅仅是"糟糕的实践",这是非常糟糕的,甚至对调试没有帮助-它锁定浏览器,使其在循环结束之前无法使用!即使试图找出一个争用条件(通过"减慢"一个回调)也不能正常工作,因为JavaScript是单线程的——所有的执行都会暂停,而不仅仅是当前的回调!
- @依我所知,izkata"糟糕的练习"=="极其糟糕"的语义。你什么都没说,别人也没说。你所说的所有事情都是重要的信息,应该包括在评论中,但是没有一件事会使答案不正确。代码正确。它按预期运行。是的,预期的行为是不可取的,但它仍然按预期运行,因此代码虽然是不好的实践,但却是正确的。在被问问题的背景下,它不值得投反对票。
- @有时暂停整个浏览器进程对于调试很有用。除了客户端浏览器,请求和Web堆栈还有很多。
- @如果你想开始一个关于睡眠的最佳实践选择的问题,那就去问吧。它可能会关闭,因为它会鼓励主观回答。这不是那个问题。
- 这个不能用在铬合金上
- 谁说它锁定了浏览器?假设它是在呈现线程中被调用的(真的,在上面的例子中它是在呈现线程中),web工作者内部的阻塞睡眠函数不会导致任何问题…遗憾的是,它会使CPU峰值,但对于某些用例来说,这可能不是一个关键问题。
- 我需要这个来调试。谢谢您!
- 这就是所谓的"忙碌等待"。使用这个名字,你可以研究更多关于这样做的利弊。
- 对于延迟部分,这是有点干净……var end=new date().gettime()+delay;while(new date().gettime()
- 这对于调试WebSockets上的延迟非常有用。目前还没有工具来模拟,谢谢!
1 2 3 4
| function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
} |
此代码在指定的持续时间内阻塞。这是占用CPU的代码。这与线程阻塞自身并释放另一个线程使用的CPU周期不同。这里没有发生这种事。不要使用此代码,这是一个非常糟糕的主意。
- 延迟是秒还是毫秒?谢谢。
- 以毫秒为单位。
- 也不要在(1)时做。另一个非常坏的主意。我有很多非常糟糕的想法,我会很高兴地根据要求分享。
- 我想你的意思是这段代码被阻塞了。
- 哈哈哈,这答案的最后一句话