javascript - 递归调用异步函数

标签 javascript node.js asynchronous recursion stack-overflow

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

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

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/

相关文章:

javascript - 回调已在异步模块中调用

javascript - OpenLayers4/JavaScript : Is ther a way to get all features of an ImageWMS layer?

javascript - 仅提交一次 ajax 表单

javascript - Jquery:在动态添加的输入控件上未触发 Keyup 事件

JavaScript 错误 : Uncaught TypeError: Cannot read property 'remove' of undefined

node.js - 评估实时进程

sql - 使用 Sequelize 作为 ORM 在 Sails 应用程序中使用原始查询

ios - 异步下载多个文件与同步下载

javascript - PhantomJS 错误 : UnhandledPromiseRejectionWarning

c# - WinRT 为什么我会收到 UnauthorizedAccessException?