是否有等效的 Javascript 或 Jquery 睡眠功能?

Posted

技术标签:

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

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

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

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

谢谢!

【问题讨论】:

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

【讨论】:

以上是关于是否有等效的 Javascript 或 Jquery 睡眠功能?的主要内容,如果未能解决你的问题,请参考以下文章

HTML <select> 是不是有 onSelect 事件或等效事件?

是否有与 Java 正则表达式中的交集 (&&) 运算符等效的 JavaScript 正则表达式?

JavaScript 等效于 C# LINQ 或其他获取数据的方式 [关闭]

Javascript 等效于 Python 的 zip 函数

Javascript API 上是不是有等效的 qbChatDialog.getCustomData?

Javascript/Coffeescript/jQuery 中是不是有与 Ruby 的发送等效的内容?