我有一个异步任务,它花费很多时间,并且需要重复执行。
简单的解决方法是:
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();
})();
这似乎是特定于环境的:
但是为什么...?
答案 0 :(得分:0)
它是无限递归的,所以会导致错误。
由于您要等待十秒才能发出下一个呼叫,因此请改为在setTimeout函数中对infiniteRecursiveLoop进行下一个呼叫。
async function infiniteRecursiveLoop() {
await longLastingWork();
setTimeout(infiniteRecursiveLoop, 10000);
}
这可能会揭示出这个问题:
Strange observation on nodejs infinite loop function execution
尽管在某些情况下有可能这样做,但绝对可以肯定的做法是使用不必要的无限递归。