【问题标题】:What's the equivalent of Java's Thread.sleep() in JavaScript? [duplicate]JavaScript 中 Java 的 Thread.sleep() 等价物是什么? [复制]
【发布时间】:2010-11-29 15:56:24
【问题描述】:

Java 中的 Thread.sleep() 相当于 JavaScript 中的什么?

【问题讨论】:

    标签: java javascript


    【解决方案1】:

    假设您能够使用 ECMAScript 2017,您可以通过使用 async/await 和 setTimeout 来模拟类似的行为。这是一个示例睡眠函数:

    async function sleep(msec) {
        return new Promise(resolve => setTimeout(resolve, msec));
    }
    

    然后您可以在任何其他异步函数中使用 sleep 函数,如下所示:

    async function testSleep() {
        console.log("Waiting for 1 second...");
        await sleep(1000);
        console.log("Waiting done."); // Called 1 second after the first console.log
    }
    

    这很好,因为它避免了需要回调。缺点是它只能用于异步函数。在后台,testSleep 函数被暂停,并在睡眠完成后恢复。

    来自 MDN:

    await 表达式导致异步函数执行暂停,直到 承诺被履行或拒绝,并恢复异步执行 完成后的功能。

    完整解释见:

    【讨论】:

    • 这是2017年的推荐方法
    • 2020 年也是如此 :)
    • 太好了,救了我的命!
    【解决方案2】:

    为获得最佳解决方案,请对 ecma 脚本 2017 使用 async/await 语句

    await 只能在异步函数内部使用

    function sleep(time) {
        return new Promise((resolve) => {
            setTimeout(resolve, time || 1000);
        });
    }
    
    await sleep(10000); //this method wait for 10 sec.
    

    注意:async / await 实际上并没有像 Thread.sleep 那样停止线程,而是模拟它

    【讨论】:

    • 复制其他答案不好
    【解决方案3】:

    setTimeout 不会在您自己的线程上保持和恢复,但是 Thread.sleep 会。 Javascript 中没有真正的相等

    【讨论】:

      【解决方案4】:

      这最终帮助了我:

          var x = 0;
          var buttonText = 'LOADING';
      
          $('#startbutton').click(function(){
              $(this).text(buttonText);
              window.setTimeout(addDotToButton,2000);
          })
      
          function addDotToButton(){
              x++;
              buttonText += '.';
              $('#startbutton').text(buttonText);
      
              if (x < 4) window.setTimeout(addDotToButton, 2000);
              else location.reload(true);
          }
      

      【讨论】:

      • setTimeout 很久以前就已经提到过了。其余代码与问题无关。
      【解决方案5】:

      试试这个代码。希望对你有用。

      function sleep(seconds) 
      {
        var e = new Date().getTime() + (seconds * 1000);
        while (new Date().getTime() <= e) {}
      }
      

      【讨论】:

      • 做的正是它应该做的
      • 这不会让线程进入睡眠状态,它只是消耗线程,计算浪费,可能会阻塞 UI。不推荐。
      • 这是一个“忙等待”,也就是你在“烧线程”
      • 对于我的单元测试目的它很有用。当然,不是用于生产。
      • "thread.distract"
      【解决方案6】:

      或者您可以使用 setInterval 函数,在指定的毫秒数后调用特定函数。 google一下setInterval原型就好了。我不太记得了。

      【讨论】:

        【解决方案7】:

        简单的回答是没有这个功能。

        你拥有的最接近的东西是:

        var millisecondsToWait = 500;
        setTimeout(function() {
            // Whatever you want to do after the wait
        }, millisecondsToWait);
        

        请注意,您尤其是不想忙着等待(例如在自旋循环中),因为您的浏览器几乎肯定会在单线程环境中执行您的 JavaScript。

        以下是其他几个处理 JavaScript 线程的 SO 问题:

        这个问题也可能有帮助:

        【讨论】:

        • (+1) 看看 javascript 中的 setTimeout() 和 setInterval()
        • 为了促进良好的编码实践,最好在“500”之后插入一个分号并在代码示例中初始化“millisecondsToWait”(例如,在它前面加上“var”)(这样,如果有人复制并粘贴示例,他们最终不会得到一个隐含的全局)。
        • 很好,史蒂夫。我已经编辑了我的答案以反映您的 cmets。
        • ES6 将有一个新的操作符yield 可以用来“模拟”线程。有关示例库,请参阅 taskjs.org
        • 使用“setTimeout”不会停止javascript线程并等待。只有当调用堆栈为空时才会开始计数。但这取决于您要使用哪种方法的意图。
        【解决方案8】:

        您可以编写一个自旋循环(一个循环很长一段时间的循环,执行某种计算以延迟函数)或使用:

        setTimeout("Func1()", 3000);
        

        这将在 3 秒后调用“Func1()”。

        编辑:

        功劳归评论者所有,但您可以将匿名函数传递给 setTimeout。

        setTimeout(function() {
           //Do some stuff here
        }, 3000);
        

        这样效率更高,并且不会调用 javascript 的 eval 函数。

        【讨论】:

        • 我希望当前线程进入指定秒数的等待状态
        • 旋转循环会导致 CPU 使用率过高。
        • 您应该永远引用 setTimeout 的第一个参数——传递匿名函数或函数引用。更正后的版本是:setTimeout(Func1, 3000);
        • (引用 setTimeout 的第一个参数会不必要地调用“eval()”。)
        • @Nick:不,如果你想传递参数,你使用闭包。
        【解决方案9】:

        没有直接的等价物,因为它会暂停网页。但是有一个setTimeout(),例如:

        function doSomething() {
          thing = thing + 1;
          setTimeout(doSomething, 500);
        }
        

        闭包示例(感谢 Daniel):

        function doSomething(val) {
          thing = thing + 1;
          setTimeout(function() { doSomething(val) }, 500);
        }
        

        第二个参数是触发前的毫秒数,您可以将其用于时间事件或在执行操作之前等待。

        编辑:基于 cmets 更新以获得更清晰的结果。

        【讨论】:

          猜你喜欢
          • 2010-10-24
          • 2011-12-26
          • 1970-01-01
          • 1970-01-01
          • 2014-12-06
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          • 2021-09-21
          相关资源
          最近更新 更多