当前位置: 首页 > 面试题库 >

递归调用异步函数

鱼志学
2023-03-14
问题内容

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

显而易见的方法是从回调中调用相同的函数,如下所示:

function foo()
{
    asyncBar(foo);
}

当然,涉及一些逻辑来停止递归。问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出?


问题答案:

问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出?

否。 如果asyncBar()调用回调是异步传递的,则不会堆积堆栈。

在您的代码中:

function foo() {
    asyncBar(foo);
}

这是逐步发生的事情:

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

没有堆栈堆积。关键是异步回调在当前堆栈完成之后的某个时候被调用,然后展开并返回系统。



 类似资料:
  • 问题内容: 我可以在变量中创建一个递归函数,如下所示: 这样,将输出 。假设我做了以下事情: 将输出 如上。如果我再更改如下: 然后将给出,如预期的那样。 现在给出 它所指的,而不是函数(它本身指向的)。在某些情况下这可能是理想的,但是有没有一种方法可以编写函数以便它调用自身而不是保存它的变量? 也就是说,是否可以 仅 更改线路,以便 在调用时仍能完成所有这些步骤?我试过了,但这给了我错误。 问题

  • 第二个构造函数应该调用第一个构造函数,但却给了我“递归构造函数调用”错误。 我明白这个错误的意思,只是不明白递归在哪里。第一个contructor将作为参数,而应该是该类型的数组。我错过了什么? 多谢了。

  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调

  • 当导航到带有防护装置的页面时,已或都会打印到控制台(在等待 firebase 响应的一段时间后)。但是,导航永远不会完成。另外,如果我没有登录,我会被重定向到路由。因此,我遇到的问题是 不会向用户显示请求的页面。我假设这是因为我正在使用回调,但我无法弄清楚如何做到这一点。有什么想法吗?

  • 需求:生成一个集合的所有可能组合的算法,没有重复项,或者递归调用函数返回结果。 在JavaScript中排列提供的大部分答案,如果不是全部的话?从循环或其他函数中递归调用函数以返回结果。 循环内递归函数调用示例 在为一个集合确定了各个置换的总数之后,可以使用、和创建并填充包含所有六个置换的结果数组 在计算排列和工作面试问题时,试图根据图中显示的模式再现有序词典排列算法的结果,该算法是基于C++实用

  • 链式调用异步函数。 循环遍历包含异步事件的函数数组,每次异步事件完成后调用 next 。 const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); }; chainAsync([ next => { console.log('0 seconds');