我知道,我知道这不是一个好设计。非阻塞setTimeout或setInterval是更好的方法,但为了实现非阻塞,您需要重构整个代码以在我的方案中具有回调点。让我来解释:需要在javascript中阻止睡眠
- 我有一个功能,目的是从缓存中获取的对象(存储)
- 如果对象是可用的,我把它
- 当对象是不可用的,我请求为它,并等待,直到通过轮询可用,到期计数器/时间。在一个点上(不太远),这将是可用的,然后我返回给调用者
我无法实现回调,因为调用(栈)的链条非常深和复杂的,这是根本不可能重构所有代码以使用异步回调/等。在这个特定的情况下,我真的需要一个单线程的阻塞循环。
现在,这里是一个问题:
我不只是想用一个简单的for循环与抗衡。这会消耗太多的CPU周期,并会导致电脑风扇启动(即使几秒钟)。我期待找出什么是JavaScript命令,最慢的(或一组命令),我可以作为封闭的方式使用,如:
while (needToContinue) {
slowestCommandOrFunction();
needToContinue = checkIfNeedToContinue();
}
在网页浏览器的JavaScript中,根本就没有这种东西。在Node.js中,您可能可以做一些事情,比如使用特殊的“慢速”设备和同步I/O操作来有效地暂停执行。 (*编辑* Explosion Pills明智地注意到同步XHR的存在) – Pointy 2013-02-23 14:39:57
您知道,浏览器在您运行此“阻塞睡眠”的整个过程中都没有响应? – Sirko 2013-02-23 14:41:52
你想要的不是你所需要的 - JavaScript不能这样工作。它在单个线程上运行,与页面的其余部分共享,因此如果阻止,页面上的所有JAVASCRIPT都会被阻止。用户界面代码无法运行,甚至无法更新进度条。如果你的呼叫链很深,你必须处理“资源现在不可用”这个事实是一个返回状态。 – 2013-02-23 16:47:48