可以在javascript中实现sleep()吗?

可以在javascript中实现sleep()吗?,javascript,multithreading,sleep,thread-sleep,Javascript,Multithreading,Sleep,Thread Sleep,这是一个重复的问题。这项研究以前被问过很多次,有几十个答案,其中一些答案的评价非常高。不幸的是,据我所知,这些答案中的每一个都是你不知道的变体,这是糟糕的编程实践。改用setTimeout 这不是。一回答 有一些用例——虽然很少见,但它们确实存在——您可能希望整个页面的执行暂停一两秒钟,我发现似乎没有人对回答实际问题感兴趣,这让我感到非常沮丧。看看评论中的一些例子 我确信可以停止javascript的执行;例如,如果我使用firebug插入一个断点,那么当它到达该断点时,执行就会停止。所以,萤火

这是一个重复的问题。这项研究以前被问过很多次,有几十个答案,其中一些答案的评价非常高。不幸的是,据我所知,这些答案中的每一个都是你不知道的变体,这是糟糕的编程实践。改用setTimeout

这不是。一回答

有一些用例——虽然很少见,但它们确实存在——您可能希望整个页面的执行暂停一两秒钟,我发现似乎没有人对回答实际问题感兴趣,这让我感到非常沮丧。看看评论中的一些例子

我确信可以停止javascript的执行;例如,如果我使用firebug插入一个断点,那么当它到达该断点时,执行就会停止。所以,萤火虫可以做到。是否有某种方法可以让程序暂停当前线程的执行,直到出现超时

只是一些想法:firebug是如何做到的?是否有特定于浏览器的方法?是否可以在不指定继续超时的情况下触发停止?我可以通过编程方式插入断点,还是删除断点?我可以得到一个表示要传递给setTimeout的当前线程的闭包吗

我心中没有一个特定的用例;我只是想从比我更了解浏览器/javascript设计的人那里得到建议,看看如何才能最有效地做到这一点

到目前为止,我只提出了一个解决方案:

endtime=Date.now()+1000;
while(Date.now() < endtime)
    $.ajax(window.location.origin,{'async':false});
这似乎有效。问题是,它会发出数百个多余的请求。我会用类似mysite/sleep?delay=X的东西替换location.origin,并编写一个服务器端脚本来提供延迟,这将使延迟减少到一个,但整个过程看起来仍然非常困难。一定有更好的办法!jquery.ajax函数如何管理它?还是在某个地方埋伏着忙碌的等待

以下内容没有回答这个问题,将被否决,因为我厌倦了看到一页页的答案完全忽略了这个问题,而匆忙地大肆宣扬睡眠的害处:

睡眠是邪恶的,你应该尽一切努力避免需要它。 重构代码,以便可以使用setTimeout延迟执行。 忙等待,因为它在睡眠期间不会停止执行。 重构代码以使用语义。
你不应该这样做,这是个坏主意

。。。因为传统上浏览器是单线程的。睡眠会冻结UI和脚本

然而,现在我们有了网络工作者之类的人,情况就不是这样了。您可能不需要睡眠,但让工作人员忙着等待不会冻结UI。根据您想要冻结特定线程的程度,我看到人们使用:

endtime = Date.now()+1000;
while (Date.now() < endtime)
浏览器应在调试器语句处暂停执行。调试器几乎总是可以暂停执行,因为它控制着运行代码的VM;它可以告诉VM停止运行,这应该发生。您无法通过脚本达到这个级别,但如果您将源代码作为文本(可能来自require.js插件),则可以动态修改它以包含调试器语句,从而以编程方式插入断点。但请记住,它们只有在调试器已打开时才会生效

为了捕获线程的状态并将其持久化以供以后使用,您可能需要研究一些更复杂的函数式编程概念,尤其是。这些函数允许您将起始值包装在一系列函数中,这些函数在运行时对其进行修改,但始终以相同的方式进行。您可以在某些对象中保持简单状态,也可以通过在函数中包装函数来记录和再现线程可能完成的所有操作。这会影响性能,但您可以稍后选择最后一个函数并调用它,您应该能够重现线程可能完成的所有操作


这些都是相当复杂和特定的使用解决方案,以避免习惯性地延迟事情,但如果您假设需要它们,它们可能会很有用。

不,传统意义上的javascript睡眠是不可能实现的,因为它是基于单线程事件的模型。休眠此线程的行为将锁定正在运行的浏览器,并向用户显示一条消息,告诉他们浏览器已停止响应IE或允许他们中止当前正在运行的Firefox代码。

jQuery ajax函数使用xhr对象的同步选项执行此操作,因此,它根本不是由javascript处理的,而是由类似于警报提示或确认的浏览器api处理的。单独使用javascript执行此操作的唯一方法可能是运行while或for循环测试dateTime。但是请注意,大多数现代浏览器会在n秒后终止这样一个循环。因此,让我们直截了当地说——你已经列举了这个问题的4个正确答案——你想要的
答案错了吗?这对未来的其他人有什么帮助?哦,祝你好运,避免浏览器的错误,因为脚本正在缓慢地运行。诸如此类的消息。@KevinB通过JavaScript删除断点是我听到的最荒谬的事情。JavaScript本身不知道断点,就像C不知道VisualStudio中的断点一样。这整个问题都很荒谬。浏览器线程在最近几年发生了很大的变化,web workers等应该作为单独的线程来实现。@ssube-我不确定这一事实会特别改变这个答案。您可以使用worker在后台线程上生成一些内容,但是您仍然不能/不应该休眠UI线程worker中的忙循环不应该冻结UI。适当地推迟事情还是好得多,但简单的回答是“不”,它会冻结你的浏览器,现在有一些警告。
endtime = new Date().getTime() + 1000;
while (new Date().getTime() < endtime)
function foo() {
    do.someStuff();
    debugger;
    do.otherStuff();
}