javascript中的延迟/睡眠?

Posted

技术标签:

【中文标题】javascript中的延迟/睡眠?【英文标题】:delay/sleep in javascript? 【发布时间】:2012-04-02 01:59:01 【问题描述】:

有没有一种简单的方法可以在 javascript 中暂停脚本?我正在寻找与 Python 中的 time.sleep(1) 等效的 javascript。我不想要setTimeout(continueExecution, 10),或任何带有getTime 的东西。这个可以吗?

编辑:这不是那么容易,但我想我可以通过 setTimeout 完成它

【问题讨论】:

JavaScript 中的编程模型通常是非阻塞的,因此您不会有任何阻塞调用,例如 sleep() 函数。 否 --- 另请参阅 this maybe duplicate thread 你为什么不想使用setTimeout 只是出于好奇-您想要一种睡眠方法的原因是什么?如果你想要一种 sleep 方法,有可能有一种不那么老套的方法来完成它。 :](不是说有睡眠方法) 看看这个帖子:***.com/questions/5832276/… 【参考方案1】:

JavaScript 通常使用事件循环在单个线程中运行。这就是为什么你不能做任何“Thread.sleep”。如果可以的话,它会在这段时间内冻结其他所有内容,并且相信我,您不想这样做。这就是为什么 JavaScript 中几乎所有东西都使用非阻塞 IO 运行的原因,这就是为什么延迟执行的唯一方法是使用 setTimeout 或 setInterval。

【讨论】:

【参考方案2】:

如果没有 setTimeout,您可以一直循环,直到达到所需的日期时间:

免责声明: 这是未经测试的。 由于 javascript 是单线程的,这将在循环时冻结整个浏览器。有关此主题的更多信息,请参阅other questions。

var delay = 5; // 5 second delay
var now = new Date();
var desiredTime = new Date().setSeconds(now.getSeconds() + delay);

while (now < desiredTime) 
    now = new Date(); // update the current time


// continue execution

【讨论】:

我只是在写类似的东西。 它显然未经测试,因为如果您尝试这样做,这只会在这段时间内冻结您的浏览器。 OP也明确表示他不想要任何“getTime”之类的方法。 @HoLyVieR OP 表示他想“暂停脚本” - 如果您暂停 javascript,您将阻止浏览器。期间。 @HoLyVieR:OP 可能说过他不想使用getTime,但这并不意味着他是正确的。 “满足” OP(不可能的)欲望的唯一方法就是这样做。是的,它会冻结您的浏览器,但这就是您(出于某种原因)不想使用 setTimeout 的结果。 @jbabey 我添加评论的原因是指出您应该编辑您的答案以反映这一点。以 JavaScript 开头的人并不总是明白这只会冻结浏览器。【参考方案3】:

如果你使用 jQuery 1.5+,你可以制作一个非常简单的插件(i

(function($) 
    $.wait = function(time) 
         return $.Deferred(function(dfd) 
               setTimeout(dfd.resolve, time); // use setTimeout internally. 
         ).promise();
    
(jQuery));

然后像这样使用它:

$.wait(3000).then(function() 
   ....
);

它会在等待 3 秒后启动您的功能。它在内部使用 setTimeout,但这是在 JavaScript 中执行此操作的唯一方法。

【讨论】:

setTimeout(func, 3000)(到底发生了什么)?【参考方案4】:

你可以使用这个代码:(从http://www.phpied.com/sleep-in-javascript/偷来的)

function sleep(milliseconds) 
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) 
    if ((new Date().getTime() - start) > milliseconds)
      break;
    
  

这实际上会阻止脚本执行,无论您想要多少毫秒。除非您尝试模拟需要很长时间的任务或类似的任务,否则不要使用它。

【讨论】:

【参考方案5】:

我们有一个名为 sleep 的 npm 包,你可以看到它here

为了简单地使用它

var sleep = require('sleep');
sleep.sleep(10) //sleep for 10 seconds

但要注意这一点

这些调用将通过停止 Node.js 的事件循环来阻止所有 JavaScript 的执行!

如果你想安心睡觉,可以使用then-sleep npm 包,这是一个不错的选择

  var sleep = require('then-sleep');

// Sleep for 1 second and do something then. 
sleep(1000).then(...);

如果你使用ES7,你也可以使用es7-sleep npm package

【讨论】:

【参考方案6】:

你做这样的事情

// place you code in this function 
(async function main()

    //Do something
    console.log("something Done first ")
    // code execution will halt for period (ms)
    await sleep(3000)

    console.log("something Done 3 seconds later ")
    //Do something

)()

function sleep(period) 
    return new Promise(resolve => 
        setTimeout(() => 
            resolve();
        , period);
    );

【讨论】:

【参考方案7】:

如果你使用 node 9.3 或更高版本,你可以像这样使用Atomics.wait()

function msleep(n) 
   Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, n);
  
function sleep(n) 
    msleep(n*1000);

现在您可以拨打sleep()

【讨论】:

谢谢,现在参与我 Javascript 项目的 Python 开发人员正在锁定整个线程。

以上是关于javascript中的延迟/睡眠?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript中的睡眠/延迟

Swift 中的延迟/睡眠不起作用

如何在JavaScript中使用async / await延迟数组回调?

如何在Javascript中制作精确的睡眠功能,可能使用承诺?

如何使用任务延迟而不是Windows Silverlight应用程序中的线程睡眠

如何在 JavaScript 循环中添加延迟?