是否有等效的 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 函数