gpt4 book ai didi

javascript - 递归调用异步函数

转载 作者:数据小太阳 更新时间:2023-10-29 05:54:13 25 4
gpt4 key购买 nike

我有一个异步函数,我想连续多次调用它。问题是“多”可以是几十万,也可以是几百万……

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

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);
}

这是正在发生的事情,一步一步:

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

没有堆叠堆积。关键是异步回调会在当前堆栈完成、展开并返回系统后的某个时间调用。

关于javascript - 递归调用异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37405034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com