我目前正在使用NodeJS学习Java脚本,我正在开发一个小程序,该程序反复要求用户输入,并在用户按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运算符求值时,递归调用返回,reducing在进行任何后续的start调用之前返回调用堆栈.

然而,有一系列连接在一起的promise 正在建立,但由于这只随着使用堆内存的手动输入数量的增加而增长,这在实践中不会成为问题.

另一方面,您可以考虑使用迭代方法.

Javascript相关问答推荐

如何从JavaScript中的公共方法调用私有方法?

添加/删除时React图像上传重新渲染上传的图像

不渲染具有HTML参数的React元素

如何按预期聚合SON数据?

从实时数据库(Firebase)上的子类别读取数据

字节数组通过echo框架传输到JS blob

如何用显示网格平滑地将元素从一个地方移动到另一个地方?

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

使搜索栏更改语言

Next.js(react)使用moment或不使用日期和时间格式

成功完成Reducers后不更新状态

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

我的角模板订阅后不刷新'

保持物品顺序的可变大小物品分配到平衡组的算法

未定义引用错误:未定义&Quot;而不是&Quot;ReferenceError:在初始化&Quot;之前无法访问';a';

用于在路径之间移动图像的查询

如何在JAVASCRIPT中合并两组对象并返回一些键

react -原生向量-图标笔划宽度

react 路由DOM有条件地呈现元素

将延迟加载的模块转换为Eager 加载的模块