没有参数的异步递归函数会导致内存泄漏或堆栈溢出吗?

时间:2019-08-28 15:06:36

标签: javascript

我有一个异步任务,它花费很多时间,并且需要重复执行。

简单的解决方法是:

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

由于我不使用任何参数,也不使用await递归调用的结果,因此这不应泄漏任何内存,也不会导致堆栈溢出,对吗?因为我完全不确定。

最近的Firefox和Chrome浏览器我需要它。

编辑:
实际上,我可以只使用while(true) {...},而无需递归:)。但是我仍然想知道。

编辑2:
经过更深入的测试之后:

(async function infiniteRecursiveLoop() {
  await Promise.resolve();
  infiniteRecursiveLoop();
})();

这似乎是特定于环境的:

  • NodeJS 12-好的
  • Chrome 77-好的
  • Firefox 70-内存泄漏,没有堆栈溢出

但是为什么...?

1 个答案:

答案 0 :(得分:0)

它是无限递归的,所以会导致错误。

由于您要等待十秒才能发出下一个呼叫,因此请改为在setTimeout函数中对infiniteRecursiveLoop进行下一个呼叫。

async function infiniteRecursiveLoop() {
  await longLastingWork();
  setTimeout(infiniteRecursiveLoop, 10000);
}

这可能会揭示出这个问题:

Strange observation on nodejs infinite loop function execution

尽管在某些情况下有可能这样做,但绝对可以肯定的做法是使用不必要的无限递归。