recursion调用asynchronous函数
我有一个asynchronous函数,我想连续调用多次。 问题是,“多”可能是几十万或几百万…
显而易见的方法是从callback中调用相同的函数:
function foo() { asyncBar(foo); }
当然有些逻辑是停止recursion的。 问题是堆栈是否正在填充调用,并可能导致某些点的计算器?
问题是堆栈是否正在填充调用,并可能导致某些点的计算器?
不。如果asyncBar()
调用callback,它是asynchronous传递,那么没有堆积累。
在你的代码中:
function foo() { asyncBar(foo); }
这是发生了什么,一步一步:
- 首先调用
foo()
。 - 这然后调用
asyncBar(foo)
。 - 因为
asyncBar
是asynchronous的,这意味着它启动了一个asynchronous操作(让我们假设它是一个http GET,但任何asynchronous操作都可以)。 该asynchronous操作已启动,但随即立即返回asyncBar()
。 - 对
foo()
初始调用返回并且堆栈被完全解开。 没有foo()
在堆栈上了。 - 调用
foo()
之后的任何代码都会继续运行,直到完成并返回到事件循环。 - 同时asynchronous操作将来还会有一段时间。 这将调用您的callback在事件队列中。
- 当JS引擎完成其他Javascript(这意味着堆栈是完全空的)时,它会将事件从事件队列中拉出并调用callback函数。
- 在这种情况下,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函数。