2013-02-23 79 views
0

我知道,我知道这不是一个好设计。非阻塞setTimeout或setInterval是更好的方法,但为了实现非阻塞,您需要重构整个代码以在我的方案中具有回调点。让我来解释:需要在javascript中阻止睡眠

  1. 我有一个功能,目的是从缓存中获取的对象(存储)
  2. 如果对象是可用的,我把它
  3. 当对象是不可用的,我请求为它,并等待,直到通过轮询可用,到期计数器/时间。在一个点上(不太远),这将是可用的,然后我返回给调用者

无法实现回调,因为调用(栈)的链条非常深和复杂的,这是根本不可能重构所有代码以使用异步回调/等。在这个特定的情况下,我真的需要一个单线程的阻塞循环。

现在,这里是一个问题:

我不只是想用一个简单的for循环与抗衡。这会消耗太多的CPU周期,并会导致电脑风扇启动(即使几秒钟)。我期待找出什么是JavaScript命令,最慢的(或一组命令),我可以作为封闭的方式使用,如:

while (needToContinue) { 
    slowestCommandOrFunction(); 
    needToContinue = checkIfNeedToContinue(); 
} 
+0

在网页浏览器的JavaScript中,根本就没有这种东西。在Node.js中,您可能可以做一些事情,比如使用特殊的“慢速”设备和同步I/O操作来有效地暂停执行。 (*编辑* Explosion Pills明智地注意到同步XHR的存在) – Pointy 2013-02-23 14:39:57

+3

您知道,浏览器在您运行此“阻塞睡眠”的整个过程中都没有响应? – Sirko 2013-02-23 14:41:52

+0

你想要的不是你所需要的 - JavaScript不能这样工作。它在单个线程上运行,与页面的其余部分共享,因此如果阻止,页面上的所有JAVASCRIPT都会被阻止。用户界面代码无法运行,甚至无法更新进度条。如果你的呼叫链很深,你必须处理“资源现在不可用”这个事实是一个返回状态。 – 2013-02-23 16:47:48

回答

2

听起来好像它是要同步Ajax请求。你可以用第三个参数做这XMLHttpRequest.open

xhr.open('GET', url, false); 

我还是建议您采取重构你的代码的时候,虽然。

+0

不完全是我正在处理的。我的代码非常庞大而且非常复杂(20000行js),它不会以100%的异步方式执行。不幸的是,这是JavaScript的限制。一个单纯的CPU同步睡眠功能可以创造奇迹,如果可能的话,但迄今为止的循环都会导致CPU的强化。 – gextra 2013-02-23 16:19:10

1

如果你想加快重构,你可以使用streamlinejs。基本上,你必须用streamlinejs编译你的JS,但作为交换,你可以通过在所有参数列表中加下划线来使同步函数成为异步函数。例如。

function foo() { 
    for (var i=0; i<10; i++) { 
    bar() 
    } 
} 

简直变成

function foo(_) { 
    for (var i=0; i<10; i++) { 
    bar(_) 
    } 
} 

此外,如果您正在使用服务器端JavaScript和的NodeJS,你可以使用纤维。

+0

很好的建议。谢谢。对不起,我现在还不能投票(到目前为止声誉很低) – gextra 2013-02-23 16:15:34