关于 Node js 无限递归和异步/等待行为的问题

问题描述 投票:0回答:1

我一直在尝试在 Node js 中进行无限循环,并遇到了这个问题。我做了一些实验,想出了这三个函数。

async function rc1(){
    rc1();
}
//-> stack overflow error
async function rc2(){
    await rc2();
}
//-> stack overflow error
async function a(){}
async function rc3(){
    await a();
    rc3();
}
//-> no stack overflow error

为什么会出现这种情况?

我一直在阅读异步/等待教程,但大多数只是发布代码。有很棒的可视化工具,但它们没有显示任何等待代码的示例。如果有资源就好了

javascript node.js asynchronous async-await infinite-recursion
1个回答
0
投票

在rc2中,递归是同步发生的。操作顺序为:

  1. 调用rc2
  2. 等待承诺解决

尽管

await
关键字在语法上出现在函数调用之前,但函数调用实际上首先发生。由于 rc2 是同步调用的,因此在任何等待发生之前堆栈就会溢出。

在 rc3 中,递归是异步发生的。操作顺序:

  1. 拨打()
  2. 等待承诺解决
  3. 调用rc3

您可能已经知道

await
使函数返回一个承诺。 Await 实际上只是一种“友好”语法,用于抽象出 Promise 方法链。您可以有效地在每个
await
之间获得回调函数。它通常可能是一个相当有漏洞的抽象,就像我们在这里看到的那样,因此学习如何使用 Promise 链样式也非常有帮助。

当promise解析时,JS引擎将单独触发

await
之后的任何进一步代码。这是通过创建一个新的堆栈并调用下一段代码来完成的。因此,如果您的函数在调用自身之前等待任何内容,则该函数的每次调用都将使用一个新的堆栈。没有堆栈溢出。

© www.soinside.com 2019 - 2024. All rights reserved.