recursion调用asynchronous函数

我有一个asynchronous函数,我想连续调用多次。 问题是,“多”可能是几十万或几百万…

显而易见的方法是从callback中调用相同的函数:

function foo() { asyncBar(foo); } 

当然有些逻辑是停止recursion的。 问题是堆栈是否正在填充调用,并可能导致某些点的计算器?

问题是堆栈是否正在填充调用,并可能导致某些点的计算器?

不。如果asyncBar()调用callback,它是asynchronous传递,那么没有堆积累。

在你的代码中:

 function foo() { asyncBar(foo); } 

这是发生了什么,一步一步:

  1. 首先调用foo()
  2. 这然后调用asyncBar(foo)
  3. 因为asyncBar是asynchronous的,这意味着它启动了一个asynchronous操作(让我们假设它是一个http GET,但任何asynchronous操作都可以)。 该asynchronous操作已启动,但随即立即返回asyncBar()
  4. foo()初始调用返回并且堆栈被完全解开。 没有foo()在堆栈上了。
  5. 调用foo()之后的任何代码都会继续运行,直到完成并返回到事件循环。
  6. 同时asynchronous操作将来还会有一段时间。 这将调用您的callback在事件队列中。
  7. 当JS引擎完成其他Javascript(这意味着堆栈是完全空的)时,它会将事件从事件队列中拉出并调用callback函数。
  8. 在这种情况下,callback函数是foo所以它调用该函数并重新开始循环,返回到第2步。

没有堆积累。 关键在于asynchronouscallback会在稍后调用,在当前的堆栈结束之后,展开并返回到系统。

问题是堆栈是否正在填充调用,并可能导致某些点的计算器?

如果该方法是asynchronous的,那么你将不会获得stackoverflow

检查下面的这个例子

 function f1(n) { if (n > 0 ) { callAsynch(n, function(n){ f1(n-1) }); } } 

这个callAsynch可以是一个Ajax调用(或任何asynchronous的),它将一个callback方法作为参数。

它不会在堆栈上起作用,因为每次调用都是通过调用asynchronous方法结束的,而asynchronous方法不会将值返回给此方法,而是在完成后向队列中添加一个任务(调用f1(n-1) ) 。

在asynchronous调用的情况下没有stackoverflow。
此外,您可以方法链接 期间使用asynchronous模块,recursion调用asynchronous函数。