JavaScript 中有睡眠功能吗?

IT技术 javascript
2021-02-05 18:21:55

JavaScript 中有睡眠功能吗?

4个回答

如果您希望通过调用来阻止代码的执行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”。

谢谢。我在一个使用 JavaScript 重定向到另一个页面的 aspx 页面中使用了它,在重定向前暂停 3 秒,以便 console.log 消息在浏览器 Web 开发人员工具中保持可见: context.Response.Write("<script language= 'javascript'>setTimeout(function(){self.location='/401.aspx';},3000); console.log('Site is Redirecting');</script>");
2021-03-27 18:21:55
同时,您可以简单地使用await sleep(3000).
2021-03-31 18:21:55
将补充几点。分配给 setTimeout 的函数被放入事件队列。JavaScript 本质上是单线程的。如果队列中至少有一个事件可以“触发”(例如 4000 毫秒前设置的 3000 毫秒超时),“javascript VM”将选择一个并调用其处理程序(函数回调)。关键是实际调用不太可能在您请求它时(例如 3000 毫秒之后),它可能是 3001、3002 甚至更晚,具体取决于队列中其他事件的数量和性质,以及持续时间他们的回调。
2021-04-06 18:21:55

一种简单的、CPU 密集型的方法来阻止执行数毫秒:

/**
* Delay for a number of milliseconds
*/
function sleep(delay) {
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay);
}
@TomWijsman 实际上,这是一个真正的、很好的阻塞睡眠;)我认为没有理由使用它,但它比 setTimeout 或 setInterval 更好的睡眠,因为它们不像睡眠那样阻塞执行。
2021-03-26 18:21:55
这会浪费电池,并阻止 JS 在整个页面中执行。一个非常糟糕的主意。
2021-03-30 18:21:55
这是一个非常糟糕的主意。请看在上帝的份上不要使用此代码。
2021-04-01 18:21:55
JS 没有错,它完全按照要求执行。如果您要说这是生产的不良做法,那将是有效的,但我猜是某些人必须采取的轻率和对抗方式。 这对于某些调试和测试场景非常有用,并且实际上回答了提出的问题。 问题不是“延迟执行某事的最佳实践是什么?”
2021-04-06 18:21:55
遗憾的是它会触发 CPU 竞争,直到它返回,但对于没什么大不了的短暂睡眠,更大的遗憾是 javascript 没有以非 CPU 密集型的方式提供此功能。
2021-04-12 18:21:55

您可以使用setTimeoutsetInterval函数。

可能会有混淆,但很少有人想要真正阻止整个程序中的所有计算。对于初学者来说,问题通常是“我如何暂停这个单独的功能?” 根据我的经验,所以答案是awaitPromisesetTimeout()masteringjs.io/tutorials/fundamentals/sleep
2021-03-20 18:21:55
Sleep 是同步的,而 setTimeout 是异步的,因此随意使用这些实现可能会造成一些混淆。
2021-03-22 18:21:55
function sleep(delay) {
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay);
}

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

我想你的意思是这段代码是阻塞的。
2021-03-22 18:21:55
也不要做 while(1) {}。另一个非常糟糕的主意。我有很多非常糟糕的想法,我很乐意应要求与您分享。
2021-03-28 18:21:55
它以毫秒为单位。
2021-03-30 18:21:55
哈哈哈这个答案的最后一句话
2021-03-30 18:21:55
延迟是秒还是毫秒?谢谢。
2021-04-06 18:21:55