在 Nodejs 中通过递归编程重复的用户交互

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

我目前正在使用 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);
javascript node.js recursion user-input stack-overflow
1个回答
0
投票

这也意味着,我正在递归调用这个函数。

这不是递归的真实情况。当执行

await
运算符时,函数返回。当等待的 Promise 解析时,函数的执行上下文将被恢复,但执行将从事件循环中恢复,因此不会构建调用堆栈,除了下一次调用
start
时会增加一个额外级别。但如上所述,当计算
await
运算符时,递归调用就会返回,从而在进行任何后续 start 调用之前减少
调用堆栈。

然而,建立了一系列链接的承诺,但由于这仅随着手动输入数量的增加而增长,使用堆内存,这在实践中不会成为问题。

另一方面,您可能会考虑使用迭代方法。

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