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

时间:2009-08-14 10:10:40

标签: javascript jquery sleep

我想在javascript中使用这样的东西。

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

是否内置了Javascript或Jquery?

谢谢!

8 个答案:

答案 0 :(得分:5)

使用

setTimeout

方法

答案 1 :(得分:5)

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

这个'某事'就是你计划在睡眠之后执行的代码。

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

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

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

答案 2 :(得分:2)

第一个问题,为什么你想在一个循环内睡觉?如果需要,可能应该建立一个事件系统。我本人已多次尝试睡眠策略进行多线程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);
    }
}

这提供了您所需要的,而且更紧凑。

但是如果您的代码中确实必须具有睡眠功能,那么我建议对简单的服务器端脚本进行同步ajax调用。然后,如果您愿意,可以使用服务器上的代码进行休眠。以下是此处发布的问题的链接,其中显示了如何进行同步通话。

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

但我强烈建议您选择setTimeout方式。更清洁,如果你能避免它,你可能不希望进行任何服务器端调用。

答案 3 :(得分:2)

我已经在javascript sleep / wait上搜索/搜索了不少网页......如果你想让javascript“跑,延迟,跑”,没有答案......大多数人得到的也是“RUN, RUN(无用的东西),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>

答案 4 :(得分:1)

我看到这条评论“我尝试过使用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/

答案 5 :(得分:0)

function sleep(delay) { 
    var start = new Date().getTime(); 
    while (new Date().getTime() < start + delay); 
} 

答案 6 :(得分:0)

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

答案 7 :(得分:0)

现在使用 Typescript 更容易实现

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

用法(在异步函数中):

await delay(1000);

示例:

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