6

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

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

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

谢谢!

4

8 回答 8

5

采用

设置超时

方法

于 2009-08-14T10:13:35.400 回答
5

没有这种东西,直接。您必须告诉 javascript 在使用一段时间后唤醒“某些东西” setTimeout

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

从我在互联网上找到的一个例子:

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

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

于 2009-08-14T10:26:33.860 回答
2

第一个问题,为什么要在循环中睡觉?如果需要,也许应该建立一个事件系统。我自己已经为多线程 javascript 编程多次尝试过 sleep 策略,但发现它不能很好地工作。在 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 调用。然后,您可以根据需要使用服务器上的代码休眠。以下是此处发布的问题的链接,该链接向您展示了如何进行同步调用。

如何让 jQuery 执行同步而不是异步的 Ajax 请求?

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

于 2009-08-14T10:42:06.417 回答
2

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

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

//................................................ //示例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>
于 2009-11-10T06:01:08.580 回答
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/

于 2013-12-12T22:00:32.537 回答
0
function sleep(delay) { 
    var start = new Date().getTime(); 
    while (new Date().getTime() < start + delay); 
} 
于 2010-03-08T16:49:32.443 回答
0

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

于 2011-06-28T15:22:01.433 回答
0

如今,使用 Typescript 更容易实现这一点

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

用法(在异步函数内):

await delay(1000);

这里的例子:

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

于 2021-01-18T12:21:01.170 回答