我知道,我知道,这不是一个好的设计。非阻塞setTimeout或setInterval是一种更好的方法,但是为了实现非阻塞,您需要重构整个代码以在我的场景中具有回调点。让我解释一下:
我无法实现回调,因为调用链(堆栈)非常深且复杂,并且根本不可能重构所有代码以使用异步回调/等。在这种特定情况下,我真的需要一个单线程阻塞循环。
现在问题出现了:
我不想简单地使用带有计数器的简单for循环。这将消耗太多CPU周期并且会导致计算机风扇启动(即使几秒钟)。我想找出什么是最慢的javascript命令(或命令集),我可以用它作为阻塞方法,如:
while ( needToContinue ) {
slowestCommandOrFunction();
needToContinue = checkIfNeedToContinue();
}
答案 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,则可以使用光纤。