我有一个异步函数,我想连续多次调用它。 问题是“多”可以是几十万,也可以是几百万……
显而易见的方法是从回调中调用相同的函数:
function foo()
{
asyncBar(foo);
}
当然涉及一些逻辑来停止递归。问题是堆栈是否充满了调用并可能在某个时候导致堆栈溢出?
最佳答案
The question is whether the stack is filling with calls and may cause stackoverflow at some point?
否。如果 asyncBar()
调用异步传递的回调,则没有堆栈堆积。
在您的代码中:
function foo() {
asyncBar(foo);
}
这是正在发生的事情,一步一步:
- 首先调用
foo()
。 - 然后调用
asyncBar(foo)
。 - 因为
asyncBar
是异步的,这意味着它启动了一个异步操作(假设它是一个 http GET,但任何异步操作都可以)。该异步操作已启动,但随后asyncBar()
立即返回。 - 对
foo()
的初始调用返回并且堆栈完全展开。堆栈上不再有foo()
。 - 调用
foo()
之后的任何代码都会继续运行,直到它完成并返回到事件循环。 - 与此同时,异步操作在未来某个时间完成。这会在事件队列中调用您的回调。
- 当 JS 引擎执行完其他 Javascript(这意味着堆栈完全为空)时,它会将该事件从事件队列中拉出并调用回调。
- 在这种情况下,回调函数是
foo
,因此它会调用该函数并重新开始循环,回到第 2 步。
没有堆叠堆积。关键是异步回调会在当前堆栈完成、展开并返回系统后的某个时间调用。
关于javascript - 递归调用异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37405034/