【问题标题】:delay/sleep in javascript?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 方法,有可能有一种不那么老套的方法来完成它。 :](不是说有睡眠方法)

标签: javascript


【解决方案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 开发人员正在锁定整个线程。
          猜你喜欢
          • 2013-03-03
          • 1970-01-01
          • 2017-07-16
          • 1970-01-01
          • 2010-11-24
          • 1970-01-01
          • 2013-01-13
          • 1970-01-01
          • 2020-09-03
          相关资源
          最近更新 更多