当我运行我的代码时,Node.js 会抛出一个 "RangeError: Maximum call stack size exceeded"
由太多递归调用引起的异常。我尝试将 Node.js 堆栈大小增加 sudo node --stack-size=16000 app
,但 Node.js 崩溃而没有任何错误消息。当我在没有 sudo 的情况下再次运行它时,Node.js 会打印 'Segmentation fault: 11'
。有没有可能在不删除我的递归调用的情况下解决这个问题?
原文由 user1518183 发布,翻译遵循 CC BY-SA 4.0 许可协议
您应该将递归函数调用包装成
setTimeout
,setImmediate
或process.nextTick
函数让 node.js 有机会清除堆栈。如果您不这样做并且有许多循环没有任何 真正的 异步函数调用,或者您不等待回调,那么您的
RangeError: Maximum call stack size exceeded
将是 不可避免 的。有很多关于“潜在异步循环”的文章。 这是一个。
现在还有一些示例代码:
这是正确的:
现在您的循环可能会变得太慢,因为我们每轮都会浪费一点时间(一次浏览器往返)。但是您不必在每一轮中都调用
setTimeout
。通常每 1000 次执行一次是可以的。但这可能会因您的堆栈大小而异: