JavaScript中连续调用inquirer.prompt不生效如何解决
问题原因
inquirer完全支持连续调用多个prompt,代码运行异常由三个写法问题导致:
- 两个
inquirer.prompt调用为并行执行逻辑,没有等待上一个问询完成就触发下一个。两个异步任务同时抢占命令行输入流,会直接导致第一个问询刚渲染就异常退出、无法正常接收输入。 - 第一个
.then()回调内定义的moreRole是函数局部变量,回调外的第二个prompt无法访问该变量,本身存在作用域错误。 - 现有逻辑没有实现「选择是否继续添加成员」的循环能力,即使单次问询流程跑通,也无法支持重复添加成员的需求。
修正方案
最清晰的写法是用async/await把异步逻辑改成串行写法,避免then嵌套,同时把循环添加成员的逻辑包进去,参考代码如下:
const inquirer = require('inquirer'); async function collectTeamMembers() { const members = []; let addMore = true; while (addMore) { // 第一步:收集基础信息 const baseInfo = await inquirer.prompt([ { name: 'name', message: 'Enter team members name.', }, { name: 'role', type: 'list', message: 'Enter a team members role', choices: [ 'Engineer', 'Manager', 'Intern' ], }, { name: 'id', message: 'Please enter team members id', type: 'input' }, { name: 'email', message: 'Please enter team members email' } ]); // 第二步:根据角色动态生成专属字段问询 let extraFieldName = ''; if (baseInfo.role === 'Engineer') { extraFieldName = 'Github username'; } else if (baseInfo.role === 'Intern') { extraFieldName = 'school name'; } else { extraFieldName = 'office Number'; } const extraInfo = await inquirer.prompt([ { message: `Enter team members ${extraFieldName}`, name: 'extraValue' } ]); // 合并当前成员信息存入数组 members.push({ ...baseInfo, [extraFieldName]: extraInfo.extraValue }); // 第三步:询问是否继续添加 const confirm = await inquirer.prompt([ { type: 'list', message: 'Would you like to add another team member?', choices: [ 'Yes', 'No' ], name: 'addAnother' } ]); addMore = confirm.addAnother === 'Yes'; } // 所有成员收集完成后可在这里执行后续业务逻辑 console.log('All team members collected:', members); return members; } // 启动收集流程 collectTeamMembers();
写法说明
- 所有prompt调用前加
await,保证上一个问询完全结束、拿到结果后,才会执行下一个问询,不会出现抢占输入流的问题。 - 动态生成的专属字段变量和后续问询在同一个作用域内,不存在访问不到的问题。
- 用while循环包裹整个单成员收集流程,用户选Yes就自动进入下一轮成员信息收集,选No才会退出流程,完全匹配预期需求。
如果不想用async/await,也可以把第二个prompt调用放到第一个.then()的回调内部,在回调里拿到动态字段名之后再触发下一个prompt,只是多层then嵌套的可读性比async/await差很多。
内容的提问来源于stack exchange,提问作者DrewPayton
相关产品推荐
相关产品推荐

