我一直在尝试在 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
为什么会出现这种情况?
我一直在阅读异步/等待教程,但大多数只是发布代码。有很棒的可视化工具,但它们没有显示任何等待代码的示例。如果有资源就好了
在rc2中,递归是同步发生的。操作顺序为:
尽管
await
关键字在语法上出现在函数调用之前,但函数调用实际上首先发生。由于 rc2 是同步调用的,因此在任何等待发生之前堆栈就会溢出。
在 rc3 中,递归是异步发生的。操作顺序:
您可能已经知道
await
使函数返回一个承诺。 Await 实际上只是一种“友好”语法,用于抽象出 Promise 方法链。您可以有效地在每个 await
之间获得回调函数。它通常可能是一个相当有漏洞的抽象,就像我们在这里看到的那样,因此学习如何使用 Promise 链样式也非常有帮助。
当promise解析时,JS引擎将单独触发
await
之后的任何进一步代码。这是通过创建一个新的堆栈并调用下一段代码来完成的。因此,如果您的函数在调用自身之前等待任何内容,则该函数的每次调用都将使用一个新的堆栈。没有堆栈溢出。