我目前正在使用 Nodejs 学习 javascript,并且正在开发一个小程序,该程序反复要求用户输入并在用户按 Enter 后生成文本。
为了实现这一目标,我首先想到对主程序流程使用单个函数,该函数根据状态参数更改其行为。这也意味着,我正在以不同的状态递归调用此函数,并在这些调用之间等待用户输入。
它看起来工作正常,但我知道重复递归在某些情况下可能会导致问题。我想知道,如果是这样的情况,理论上如果用户长时间与对话交互,最终这种方法会导致堆栈溢出。
async function start(status) {
switch (status) {
// StartMenu
case 0:
let input1 = await waitForInput(["1", "2", "3", "exit", "quit"]);
if (["exit", "quit"].includes(input1)) {
return start(2);
} else {
doSomething(input1);
return start(1);
}
// Something
case 1:
let nextAction = await waitForInput(["", "back", "exit", "quit"]);
switch (nextAction) {
case "":
doSomethingElse();
return start(1);
case "back":
return start(0);
case "exit":
case "quit":
return start(2);
}
break;
// Exit/ Quit
case 2:
console.log("Program exiting...");
break;
default:
console.log("Error: invalid status");
break;
}
}
start(0);
这也意味着,我正在递归调用这个函数。
这不是递归的真实情况。当执行
await
运算符时,函数返回。当等待的 Promise 解析时,函数的执行上下文将被恢复,但执行将从事件循环中恢复,因此不会构建调用堆栈,除了下一次调用 start
时会增加一个额外级别。但如上所述,当计算 await
运算符时,递归调用就会返回,从而在进行任何后续 start
调用之前减少调用堆栈。然而,建立了一系列链接的承诺,但由于这仅随着手动输入数量的增加而增长,使用堆内存,这在实践中不会成为问题。
另一方面,您可能会考虑使用迭代方法。