Node.js中的中断繁忙循环

Interrupt busy loop in Node.js

本文关键字:循环 中断 js Node      更新时间:2024-03-20

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

我尝试过用async实现循环,但这导致了超过调用堆栈(I很容易达到2000000)。

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);
})();