【问题标题】:Is there an equivalent Javascript or Jquery sleep function?是否有等效的 Javascript 或 Jquery 睡眠功能?
【发布时间】:2010-11-19 14:37:45
【问题描述】:

我想要在 javascript 中这样的东西。

for (i = 0; i < 10; i++) {
    alert(i);
    // now sleep 1 sec
    sleep(1000);
}

是否有为此内置的 Javascript 或 Jquery?

谢谢!

【问题讨论】:

  • 发帖前我要做的第一件事是stackoverflow.com/search?q=[JavaScript]+sleep,你可以看到已经有很多解决方案了
  • 接下来的事情是想知道为什么您需要睡眠,而不是像 Zoidberg 建议的基于事件的解决方案。

标签: javascript jquery sleep


【解决方案1】:

没有这样的事情,直接。您必须使用 setTimeout 告诉 javascript 在一段时间后唤醒“某事”。

这个“东西”当然是您计划在睡眠之后执行的代码。

从我在the internet 上找到的一个例子:

function dothingswithsleep( part ) {
    if( part == 0 ) {
        alert( "before sleep" );
        setTimeout( function() { dothingswithsleep( 1 ); }, 1000 );
    } else if( part == 1 ) {
        alert( "after sleep" );
    }
}

但这是脆弱的设计。您最好在一秒钟后重新考虑您的业务逻辑以真正做某事:调用不同的函数而不是使用这些人为的辅助变量。

【讨论】:

    【解决方案2】:

    使用

    setTimeout

    方法

    【讨论】:

    • 只是 setTimeout 需要一个延续函数作为参数。
    • 我尝试过使用 setTimeout,但我不需要延续函数。
    • 如果您想要类似 php 的行为,则必须继续。 setTimeout(runThisFunc(),after1sec) - 与 php 不同,js 不会等待一行完全完成,直到下一行被执行。
    【解决方案3】:

    第一个问题,为什么要在循环中睡觉?如果需要,也许应该建立一个事件系统。我自己已经为多线程 javascript 编程尝试过多次睡眠策略,但发现它不能很好地工作。在 javascript 中执行多线程的最佳方法是使用事件系统,例如 YUI 或几乎任何其他框架提供的事件系统。让你的听众订阅这个事件并在它发生时做一些事情。在这些事件框架中,您可以完全控制自己的自定义事件何时触发,因此没什么大不了的。

    这里是 YUI 事件框架的链接。

    http://developer.yahoo.com/yui/examples/event/index.html

    这是使用 YUI 编码的方式

    var myEvent = new YAHOO.util.CustomEvent('fooEvent');
    // subscribe a function to be called (first param) inside the scope of an object
    // (second param).
    myEvent.subscribe(function() {alert(this.count++);},{count:0},true);
    setTimeout('myEvent.fire()',1000);
    

    这样做的方式更干净,更紧凑。或者如果你不想使用事件框架,试试这个

    var myObj = {
        count:0,
        doSomething:function(){alert(this.count++);}
        loopFunc:function(){
            this.doSomething();
            setTimeout('myObj.loopFunc()',1000);
        }
    }
    

    它提供了您需要的东西,而且更紧凑。

    但是如果你真的必须在你的代码中有一个 sleep 函数,那么我建议你对一个简单的服务器端脚本进行同步 ajax 调用。然后,您可以根据需要使用服务器上的代码休眠。以下是此处发布的问题的链接,该问题向您展示了如何进行同步调用。

    How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?

    但我强烈建议您使用 setTimeout 方式。更干净,如果可以避免的话,您可能不想进行任何服务器端调用。

    【讨论】:

    • 我也一直在用 JS 做回调,我学到的一件事是你的 loopFunc 将被 this 调用,除了你的 myObj。您需要将所需的this 存储在一个闭包中。
    • 除此之外,您对基于事件的建议很有价值!
    • 第二个示例应该可以工作,因为 loopFunc 将在 myObj 范围内执行。所以这应该引用 myObj,我不喜欢的唯一问题是 myObj 必须是一个全局可用的变量,setTimeout 的执行才能找到它。你能进一步解释一下“闭包中的这个”是什么意思吗?
    【解决方案4】:

    我已经搜索/谷歌了很多关于 javascript sleep/wait 的网页......如果你想让 javascript “运行,延迟,运行”没有答案......大多数人得到的是,“运行, RUN(无用的东西),RUN”或“RUN,RUN +延迟运行”......

    所以我吃了一些汉堡并开始思考::: 这是一个可行的解决方案...但是您必须删除正在运行的代码...:::

    //……………………………………………………………………………… //例子1:

    <html>
    <body>
    <div id="id1">DISPLAY</div>
    
    <script>
    //javascript sleep by "therealdealsince1982"; copyrighted 2009
    //setInterval
    var i = 0;
    
    function run() {
        //pieces of codes to run
        if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
        if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
        if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
        if (i >2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
        if (i==5){document.getElementById("id1").innerHTML= "<p>all code segment finished running</p>"; clearInterval(t); } //end interval, stops run
        i++; //segment of code finished running, next...
    }
    
    t=setInterval("run()",1000);
    
    </script>
    </body>
    </html>
    

    //.................................................. //例子2:

    <html>
    <body>
    <div id="id1">DISPLAY</div>
    
    <script>
    //javascript sleep by "therealdealsince1982"; copyrighted 2009
    //setTimeout
    var i = 0;
    
    function run() {
        //pieces of codes to run, can use switch statement
        if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(1000);}
        if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(2000);}
        if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(3000);}
        if (i==3){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>";} //stops automatically
        i++;
    }
    
    function sleep(dur) {t=setTimeout("run()",dur);} //starts flow control again after dur
    
    run(); //starts flow
    </script>
    </body>
    </html>
    

    【讨论】:

      【解决方案5】:

      我看到这条评论“我尝试过使用 setTimeout,但我不需要延续函数”并想,是的,你需要。你不需要的是一个循环。你需要一个递归函数。

      这个

      for (i = 0; i < 10; i++) {
          alert(i);
          // now sleep 1 sec
          sleep(1000);
      }
      

      翻译成这个

      function recursive( i, max )
      {
          if ( i > max ) return;
          alert( i );
          i = i + 1;
          setTimeout( function(){ recursive(i, max); }, 1000 );
      }
      
      recursive(1, 10);
      

      示例:http://jsfiddle.net/q76Qa/

      【讨论】:

        【解决方案6】:

        好吧,如果你在网络服务器上安装了 PHP,你可以使用 $.load 或类似的方法来调用一个只有 sleep(int) 的 PHP 文件...

        【讨论】:

          【解决方案7】:
          function sleep(delay) { 
              var start = new Date().getTime(); 
              while (new Date().getTime() < start + delay); 
          } 
          

          【讨论】:

          • 所以这就像 10 年前一样......但是你能演示一下用法吗?
          【解决方案8】:

          现在使用 Typescript 更容易实现这一点

          function delay(ms: number) {
              return new Promise( resolve => setTimeout(resolve, ms));
          }
          

          用法(在异步函数中):

          await delay(1000);
          

          此处示例:

          https://codepen.io/britsymate/pen/OJRdORX

          【讨论】:

            猜你喜欢
            • 2011-12-12
            • 2011-04-08
            • 2019-10-21
            • 2010-11-11
            • 2010-11-12
            • 1970-01-01
            • 1970-01-01
            • 2018-01-19
            • 2023-03-29
            相关资源
            最近更新 更多