gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:56:18 27 4
gpt4 key购买 nike

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

简单的解决方案是:

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 - 内存泄漏,无堆栈溢出

但是为什么...?

最佳答案

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

由于您想等待 10 秒等待下一次调用结束,因此请在您的 setTimeout 函数中进行下一次对 infiniteRecursiveLoop 的调用。

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

这可能会阐明这个问题:

Strange observation on nodejs infinite loop function execution

虽然在某些情况下可以这样做,但使用不必要的无限递归肯定是不好的做法。

关于javascript - 没有参数的异步递归函数会泄漏内存或堆栈溢出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57695381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com