延迟/睡眠在JavaScript?

时间:2012-03-16 14:06:40

标签: javascript

有没有一种简单的方法可以在Javascript中暂停脚本?我正在寻找Python中time.sleep(1)的javascript等价物。我不希望setTimeout(continueExecution, 10)或任何getTime的内容。可以这样做吗?

编辑:这不是那么容易,但我想我可以用setTimeout

完成它

7 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:7)

没有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

答案 2 :(得分:2)

如果你使用的是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中执行此操作的唯一方法。

答案 3 :(得分:1)

您可以使用以下代码:(来自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;
    }
  }
}

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

答案 4 :(得分:1)

我们有一个名为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

答案 5 :(得分:0)

你做这样的事情

// 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);
    });
}

答案 6 :(得分:0)

如果您使用9.3或更高版本的节点,则可以使用Atomics.wait()这样的

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

现在您可以致电sleep()