有没有比下面的pausecomp
函数(taken from here)更好的在JavaScript中设计sleep
的方法呢?
function pausecomp(millis)
{
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);
}
这不是Sleep in JavaScript - delay between actions的副本;我希望在函数执行过程中有一个真正的睡眠,而不是一段代码执行之前的延迟。
发布于 2011-05-13 21:21:37
我认为,想要执行一个操作,等待,然后执行另一个操作,这是完全合理的。如果您习惯于使用多线程语言编写代码,那么您可能会想到在线程唤醒之前执行一段时间。
这里的问题是,JavaScript是一个基于事件的单线程模型。虽然在特定的情况下,让整个引擎等待几秒钟可能会很好,但通常这是不好的做法。假设我想在编写自己的函数时使用您的函数?当我调用你的方法时,我的方法都会冻结。如果JavaScript可以以某种方式保存函数的执行上下文,将其存储在某个位置,然后将其带回并在稍后继续,那么可能会发生休眠,但这基本上是线程处理。
因此,您在很大程度上坚持其他人的建议--您需要将代码分解为多个函数。
那么,你的问题有点错误的选择。没有办法以你想要的方式睡觉,你也不应该追求你建议的解决方案。
发布于 2009-06-04 14:46:54
在JavaScript中,我重写了每个函数,以便它可以尽快结束。您希望浏览器重新得到控制,这样它就可以对DOM进行更改。
每当我想在我的函数中间睡一觉时,我就重构为使用setTimeout()
。
编辑
睡眠或延迟在任何语言中的臭名昭著的功能都有很多争论。有些人会说,应该总是有一个信号或回调来触发给定的功能,另一些人会争辩说,有时任意的延迟时刻是有用的。我要说的是,在这个行业中,每个人都有自己的规则,一条规则永远不会决定任何事情。
编写睡眠函数很简单,使用JavaScript Promise甚至可以让它变得更有用:
// sleep time expects milliseconds
function sleep (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
// Usage!
sleep(500).then(() => {
// Do something after the sleep!
});
发布于 2009-06-04 14:55:30
我同意其他的海报。忙碌的睡眠不是一个好主意。
但是,setTimeout不会阻止执行。它在设置超时后立即执行函数的下一行,而不是在超时到期后执行,因此这不会完成与睡眠相同的任务。
这样做的方法是将你的函数分解成前后两部分。
function doStuff()
{
// Do some things
setTimeout(continueExecution, 10000) // Wait ten seconds before continuing
}
function continueExecution()
{
// Finish doing things after the pause
}
确保您的函数名称仍然准确地描述了每个部分的作用(例如,GatherInputThenWait和CheckInput,而不是funcPart1和funcPart2)
此方法实现了在超时之前不执行您决定的代码行的目的,同时仍然将控制权返回给客户端PC以执行它排队的任何其他代码行。
正如评论中指出的那样,这绝对不会在循环中工作。你可以做一些花哨的(丑陋的)黑客来让它在循环中工作,但一般来说,这只会产生灾难性的意大利面条代码。
https://stackoverflow.com/questions/951021
复制相似问题