0

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

  1. 我有一个旨在从缓存(存储)中获取对象的函数
  2. 如果对象可用,我接受它
  3. 当对象不可用时,我请求它并通过轮询等待直到可用,并带有到期计数器/时间。在某一时刻(不太远)它将可用,然后我返回给调用者

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

现在问题来了:

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

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

2 回答 2

2

听起来这是您想要同步的 ajax 请求。你可以用第三个参数来做到这一点XMLHttpRequest.open

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

不过,我仍然建议您花时间重构您的代码。

于 2013-02-23T14:41:09.147 回答
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 一起使用,则可以使用光纤。

于 2013-02-23T14:44:41.943 回答