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

如何正确嵌套Inquirer交互式命令行提示符?

解决Inquirer嵌套提示符叠加的问题

核心问题是你的主循环没有等待嵌套的异步操作完成就继续执行,导致主提示符和子提示符同时弹出。以下是具体修复方案:

1. 确保所有操作函数异步化,并在主循环中await执行结果

主函数init()的switch语句里,必须等待每个操作的异步逻辑完全结束后,才进入下一次循环迭代。

错误示例(导致叠加):

async function init() {
  while (true) {
    const choice = await inquirer.prompt(mainQuestions);
    switch(choice.action) {
      case 'add employee':
        addEmployee(); // 未await,主循环直接继续运行
        break;
    }
  }
}

function addEmployee() {
  inquirer.prompt(employeeQuestions).then(data => {
    // 执行SQL操作
  });
}

正确写法:

// 将操作函数改为async,内部await所有异步步骤
async function addEmployee() {
  const employeeData = await inquirer.prompt(employeeQuestions);
  // 等待SQL插入操作完成
  await db.query('INSERT INTO employees SET ?', employeeData);
  console.log('员工添加成功');
}

async function init() {
  while (true) {
    const { action } = await inquirer.prompt([
      {
        type: 'list',
        name: 'action',
        message: '选择操作:',
        choices: ['添加员工', '查询员工', '退出']
      }
    ]);

    switch(action) {
      case '添加员工':
        await addEmployee(); // 关键:等待该操作完成再进入下一次循环
        break;
      case '查询员工':
        await queryEmployees();
        break;
      case '退出':
        console.log('程序结束');
        process.exit(0);
      default:
        console.log('无效操作,请重新选择');
    }
  }
}

init();

2. 多层嵌套提示符需逐层await

如果后续需要多步操作(比如添加员工时先选部门,再输入信息),每一步的inquirer.prompt都要await,确保串行执行:

async function addEmployee() {
  // 第一步:选择所属部门
  const { department } = await inquirer.prompt([
    {
      type: 'list',
      name: 'department',
      message: '选择所属部门:',
      choices: await fetchDepartmentOptions() // 异步获取选项也要await
    }
  ]);

  // 第二步:输入员工基础信息
  const { name, role } = await inquirer.prompt([
    { type: 'input', name: 'name', message: '员工姓名:' },
    { type: 'input', name: 'role', message: '员工职位:' }
  ]);

  // 第三步:执行SQL插入操作
  await db.query(
    'INSERT INTO employees (name, role, department) VALUES (?, ?, ?)',
    [name, role, department]
  );
}

3. 添加错误处理避免程序崩溃

用try/catch包裹异步操作,防止单个步骤出错导致整个程序停止:

async function init() {
  while (true) {
    try {
      const { action } = await inquirer.prompt(mainQuestions);
      switch(action) {
        case '添加员工':
          await addEmployee();
          break;
        // 其他操作分支
      }
    } catch (err) {
      console.error('操作失败:', err.message);
    }
  }
}

通过以上调整,所有异步操作都会串行执行,主提示符只会在上一次操作完全结束后才会再次显示,不会出现叠加问题。

内容的提问来源于stack exchange,提问作者JShoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:25:30