我想在javascript中使用这样的东西。
for (i = 0; i < 10; i++) {
alert(i);
// now sleep 1 sec
sleep(1000);
}
是否内置了Javascript或Jquery?
谢谢!
答案 0 :(得分:5)
答案 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);
答案 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);
示例: