需要在javascript中阻止睡眠

时间:2013-02-23 14:36:35

标签: javascript

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

  1. 我有一个旨在从缓存(存储)中获取对象的函数
  2. 如果对象可用,我会接受
  3. 当对象不可用时,我请求它并等待直到可用轮询,到期计数器/时间。在某一点(不太远),它将可用,然后我返回呼叫者
  4. 无法实现回调,因为调用链(堆栈)非常深且复杂,并且根本不可能重构所有代码以使用异步回调/等。在这种特定情况下,我真的需要一个单线程阻塞循环。

    现在问题出现了:

    我不想简单地使用带有计数器的简单for循环。这将消耗太多CPU周期并且会导致计算机风扇启动(即使几秒钟)。我想找出什么是最慢的javascript命令(或命令集),我可以用它作为阻塞方法,如:

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

2 个答案:

答案 0 :(得分:2)

听起来这是一个你要同步的ajax请求。您可以使用XMLHttpRequest.open的第三个参数执行此操作:

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

我仍然建议你花时间重构代码。

答案 1 :(得分:1)

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

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

简单地变成

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

此外,如果您使用带有nodejs的服务器端javascript,则可以使用光纤。