Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 没有参数的异步递归函数是否会泄漏内存或导致堆栈溢出?_Javascript - Fatal编程技术网

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();})()这看起来不错,但这是因为它的工作速度非常慢。最终它将导致堆栈溢出,因为无限递归就是这样工作的。此外,在本例中实际上不需要递归。您需要的是一个连续调用函数的循环。递归对于这个用例是完全不合适的。你怎么会认为这会导致“错误”?具体是什么错误?@Liam
setInterval
有什么问题?它不会等待长时间任务的执行。在我的例子中,任务通常比间隔时间长。然后使用
setTimeout
。我看不出有什么特别“危险”的地方。你看不出程序中无限递归有什么错误吗?即使是简单的坏习惯?您似乎在这里给async Wait特定的导致泄漏的权限。这只是承诺的简化,也就是回电的简化。JS引擎垃圾收集器应该清理得很好,并提供您不需要创建大量内存的功能。我真的不明白为什么这会比运行这个非异步程序更容易引起问题。通常不太清楚你的要求是什么