如何在JS函数任意执行阶段,让用户输入reset即可回到初始level 0状态?
多轮对话reset功能实现方案
问题根因
- reset判断的放置位置错误:你把reset逻辑放在了各level业务分支之后,而所有level的业务分支命中后都会执行return语句,直接结束函数执行,reset逻辑根本没有机会被触发
- 重置操作不完整:仅修改了level变量,未清空
usersName、path两个关联的状态变量,重置后开启新对话会残留上一轮的用户数据 - 原代码未处理非yes/no的输入场景,用户输入其他内容时函数无返回值,不符合不限制输入的需求
正确实现代码
let level = 0; let usersName; let path; const getBotReply = (msg) => { // 将reset判断放在函数最入口,优先级高于所有业务逻辑 if (msg === "reset") { // 重置所有状态变量到初始值 level = 0; usersName = undefined; path = undefined; return "对话已重置,请输入你的姓名重新开始"; } if (level === 0) { level = 1; usersName = msg; return "Chur " + usersName + ". Do you live in Raglan?"; } if (level === 1) { level = 2; if (msg === "yes") { path = "left-yes"; return "Do you know how to surf?"; } if (msg === "no") { path = "right-no"; return "Are you from Auckland?"; } // 补充非yes/no输入的兜底提示 return "我暂时无法识别该内容,你可以输入yes/no继续对话,或输入reset重置对话"; } // 后续level的业务逻辑可在此处扩展,同时可以补充对应层级的输入兜底逻辑 }
实现说明
- reset逻辑放在函数最开头,任何阶段用户输入reset都会优先触发重置,不会被后续业务逻辑拦截
- 重置操作清空了所有关联状态,避免旧数据干扰新对话流程
- 补充了非预期输入的兜底返回,符合无需限制用户只能输入yes/no的需求
- 重置后返回明确的操作提示,引导用户下一步操作
内容的提问来源于stack exchange,提问作者Eliot Robinson
相关产品推荐
相关产品推荐

