如何阻止Node.js应用处理完成后退出,实现Inquirer循环询问用户
Node.js inquirer 循环发起提问实现方案
你之前的实现失效是因为run()是异步函数,同步的死循环不会等待异步任务执行完成,就会连续发起多次提问,导致控制台刷屏。
方案1:带await的死循环实现(更直观)
直接用while(true)循环,每次循环都等待run()执行完成后再进入下一轮:
// 替换原有代码末尾的 run(); 即可 const loopRun = async () => { while (true) { // 等待当前轮次的提问、处理逻辑全部执行完成 await run(); } } // 加上错误捕获,避免运行报错直接退出 loopRun().catch(err => { console.error('运行出错:', err); process.exit(1); });
方案2:递归链式调用实现
如果不想写循环,也可以在run()执行完成后递归触发下一次执行:
// 替换原有代码末尾的 run(); 即可 const start = () => { run() .then(start) // 本轮执行完成后触发下一轮 .catch(err => { console.error('运行出错:', err); process.exit(1); }) } start();
可选扩展:增加手动退出选项
如果不想仅靠强制终止进程退出,可以在form()的提问逻辑中增加退出选项,用户选择退出时直接终止进程即可:
// 示例:在inquirer的提问列表中新增退出选项 const form = async () => { return inquirer.prompt([ // 你原有其他提问 { type: 'confirm', name: 'exit', message: '是否退出程序?', default: false } ]) } // 然后在run()中增加判断逻辑 const run = async function() { const answers = await form(); if (answers.exit) { console.log('程序退出'); process.exit(0); } // 原有其他处理逻辑 // ~~ }
内容的提问来源于stack exchange,提问作者EukkMaru
相关产品推荐
相关产品推荐

