首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript ()的睡眠版本是什么?

JavaScript ()的睡眠版本是什么?
EN

Stack Overflow用户
提问于 2009-06-04 22:41:10
回答 68查看 3.5M关注 0票数 3K

有没有比下面的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的副本;我希望在函数执行过程中有一个真正的睡眠,而不是一段代码执行之前的延迟。

EN

回答 68

Stack Overflow用户

发布于 2011-05-13 21:21:37

(请参阅updated answer for 2016)

我认为,想要执行一个操作,等待,然后执行另一个操作,这是完全合理的。如果您习惯于使用多线程语言编写代码,那么您可能会想到在线程唤醒之前执行一段时间。

这里的问题是,JavaScript是一个基于事件的单线程模型。虽然在特定的情况下,让整个引擎等待几秒钟可能会很好,但通常这是不好的做法。假设我想在编写自己的函数时使用您的函数?当我调用你的方法时,我的方法都会冻结。如果JavaScript可以以某种方式保存函数的执行上下文,将其存储在某个位置,然后将其带回并在稍后继续,那么可能会发生休眠,但这基本上是线程处理。

因此,您在很大程度上坚持其他人的建议--您需要将代码分解为多个函数。

那么,你的问题有点错误的选择。没有办法以你想要的方式睡觉,你也不应该追求你建议的解决方案。

票数 859
EN

Stack Overflow用户

发布于 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!
});
票数 735
EN

Stack Overflow用户

发布于 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以执行它排队的任何其他代码行。

正如评论中指出的那样,这绝对不会在循环中工作。你可以做一些花哨的(丑陋的)黑客来让它在循环中工作,但一般来说,这只会产生灾难性的意大利面条代码。

票数 197
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/951021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档