中断 Node.js 中的繁忙循环

Interrupt busy loop in Node.js

我的 Node.js 代码中有一个简单的繁忙循环,结果需要几秒钟才能完成。这段时间我需要执行一些 I/O 操作,这些操作目前在队列中并且全部在循环之后执行,而不是 "parallel" 与循环。我知道 Node 不执行并行执行,所以我正在寻找一些方法来中断循环以允许 Node 执行其他操作。

我曾尝试使用异步实现循环,但这导致超出调用堆栈(i 很容易达到 2,000,000)。

while(i < length){
    if(something) sendWebSocketMessage();
    //Do stuff with i
    i++;
}

有什么想法吗?

一个解决方案可能是像这样编写循环:

(function step(){
     doSomething();
     if (length--) setImmediate(step);
})();

这样就会处理中间发生的其他事件。如果你的循环因为大量的迭代而很长(相对于长步骤),你可以用部分循环代替 doSomething().

如果你想减慢你的循环,以便有更多时间处理其他任务,你也可以使用 setTimeout 和非空超时:

(function step(){
     doSomething();
     if (length--) setTimeout(step, 5);
})();