我想要在 javascript 中这样的东西。
for (i = 0; i < 10; i++) {
alert(i);
// now sleep 1 sec
sleep(1000);
}
是否有为此内置的 Javascript 或 Jquery?
谢谢!
我想要在 javascript 中这样的东西。
for (i = 0; i < 10; i++) {
alert(i);
// now sleep 1 sec
sleep(1000);
}
是否有为此内置的 Javascript 或 Jquery?
谢谢!
没有这种东西,直接。您必须告诉 javascript 在使用一段时间后唤醒“某些东西” setTimeout
。
当然,这个“东西”将是您计划在睡眠后执行的代码。
从我在互联网上找到的一个例子:
function dothingswithsleep( part ) {
if( part == 0 ) {
alert( "before sleep" );
setTimeout( function() { dothingswithsleep( 1 ); }, 1000 );
} else if( part == 1 ) {
alert( "after sleep" );
}
}
但这是脆弱的设计。您最好重新考虑您的业务逻辑,以便在一秒钟后真正做一些事情:调用不同的函数而不是使用这些人为的辅助变量。
第一个问题,为什么要在循环中睡觉?如果需要,也许应该建立一个事件系统。我自己已经为多线程 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 方式。干净得多,如果可以避免的话,您可能不想进行任何服务器端调用。
我已经搜索/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>
我看到这条评论“我尝试过使用 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/
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
好吧,如果您在网络服务器上安装了 PHP,您可以使用$.load
或类似方法来调用仅包含其中的 PHP 文件sleep(int)
...
如今,使用 Typescript 更容易实现这一点
function delay(ms: number) {
return new Promise( resolve => setTimeout(resolve, ms));
}
用法(在异步函数内):
await delay(1000);
这里的例子: