Javascript 没有参数的异步递归函数是否会泄漏内存或导致堆栈溢出?
我有一个异步任务,需要花费很多时间,需要重复执行 简单的解决办法是:Javascript 没有参数的异步递归函数是否会泄漏内存或导致堆栈溢出?,javascript,Javascript,我有一个异步任务,需要花费很多时间,需要重复执行 简单的解决办法是: const timeoutPromise = delay => new Promise(resolve => setTimeout(resolve, delay)); async function infiniteRecursiveLoop() { await longLastingWork(); await timeoutPromise(10000); // each time work is don
const timeoutPromise = delay => new Promise(resolve => setTimeout(resolve, delay));
async function infiniteRecursiveLoop() {
await longLastingWork();
await timeoutPromise(10000); // each time work is done, wait 10s and then run it again
infiniteRecursiveLoop();
}
因为我不使用任何参数,也不等待递归调用的结果,所以这不会泄漏任何内存,也不会导致堆栈溢出,对吗?因为我一点也不确定。
我需要这个用于最近的Firefox和Chrome
编辑:实际上我可以使用
,而(true){…}
,不需要递归:)。但我还是想知道
编辑2:测试更密集的版本后:
(async function infiniteRecursiveLoop() {
await Promise.resolve();
infiniteRecursiveLoop();
})();
这似乎是特定于环境的:
- NodeJS 12-好的
- 铬77-正常
- Firefox 70-内存泄漏,无堆栈溢出
但是为什么…?它是无限递归的,所以是的,它会导致错误 因为您想等待10秒钟,等待下一个调用发出,所以在setTimeout函数中对InfiniteCursiveLoop进行下一个调用
async function infiniteRecursiveLoop() {
await longLastingWork();
setTimeout(infiniteRecursiveLoop, 10000);
}
这可能会对这个问题有所帮助:
虽然在某些情况下可以这样做,但使用不必要的无限递归肯定是不好的做法 是的,这看起来不那么危险,但是我也不确定我的代码是否会失败。我刚刚尝试在NodeJS中执行它,它看起来像是一个没有内存泄漏的非常好的无限循环:
(异步函数InfiniteCursiveLoop(){await Promise.resolve();InfiniteCursiveLoop();})()代码>这看起来不错,但这是因为它的工作速度非常慢。最终它将导致堆栈溢出,因为无限递归就是这样工作的。此外,在本例中实际上不需要递归。您需要的是一个连续调用函数的循环。递归对于这个用例是完全不合适的。你怎么会认为这会导致“错误”?具体是什么错误?@LiamsetInterval
有什么问题?它不会等待长时间任务的执行。在我的例子中,任务通常比间隔时间长。然后使用setTimeout
。我看不出有什么特别“危险”的地方。你看不出程序中无限递归有什么错误吗?即使是简单的坏习惯?您似乎在这里给async Wait特定的导致泄漏的权限。这只是承诺的简化,也就是回电的简化。JS引擎垃圾收集器应该清理得很好,并提供您不需要创建大量内存的功能。我真的不明白为什么这会比运行这个非异步程序更容易引起问题。通常不太清楚你的要求是什么