递归调用异步函数
我有一个异步函数,要连续多次调用。问题是“多个”可以是几十万或数百万…
显而易见的方法是从回调中调用相同的函数,如下所示:
function foo(){
asyncBar(foo);
}
当然,涉及一些逻辑来停止递归。问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出?
回答:
问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出?
如果asyncBar()
调用回调是异步传递的,则不会堆积堆栈。
在您的代码中:
function foo() { asyncBar(foo);
}
这是逐步发生的事情:
- 首先
foo()
被称为。 - 然后调用
asyncBar(foo)
。 - 因为
asyncBar
是异步的,所以这意味着它将启动一个异步操作(假设它是一个http GET,但是任何异步操作都可以)。该异步操作已启动,但随后asyncBar()
立即返回。 - 最初的return调用
foo()
和堆栈已完全展开。foo()
堆栈上再也没有了。 - 调用之后的任何代码将
foo()
继续运行,直到完成为止,并返回到事件循环。 - 同时,异步操作将在将来的某个时间完成。这会将对您的回调的调用放在事件队列中。
- 当JS引擎执行完其他Javascript(这意味着堆栈完全为空)后,它将把该事件从事件队列中拉出并调用回调。
- 在这种情况下,回调函数就是
foo
这样,它将调用该函数并重新开始循环,直接回到步骤2。
没有堆栈堆积。关键是异步回调在当前堆栈完成之后的某个时候被调用,然后展开并返回系统。
以上是 递归调用异步函数 的全部内容, 来源链接: utcz.com/qa/425884.html