You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:33:24