如何使用inquirer.js的when方法优化多分支逻辑并实现菜单返回功能
inquirer.js 代码优化方案
下面的优化方案可以同时满足你提出的两个核心需求,同时删除冗余的if分支和嵌套回调,代码可维护性更高:
const inquirer = require('inquirer'); // 你的钱包数据 const wallet = { 1: {/* 钱包1信息 */}, 2: {/* 钱包2信息 */}, 3: {/* 钱包3信息 */} } // 封装主菜单为可重复调用函数,实现退出后返回初始页面的需求 function mainMenu() { inquirer.prompt([ // 主菜单选项 { type: 'list', message: "Select an option", name: 'walletOptions', choices: [ 'Wallet', 'Normal Transaction', 'Arbitrage' ] }, // 账户选择选项,只有用户选了Wallet才会展示 { type: 'list', message: "Select an account", name: 'accountOptions', choices: [ '1', '2', '3', '<<< Quit' ], // 核心:when配置项控制当前问题是否展示 when: (answers) => answers.walletOptions === 'Wallet' } ]).then(answers => { const { walletOptions, accountOptions } = answers; // 账户操作映射表:替代if分支匹配账户逻辑 const accountActionMap = { '1': () => console.log(wallet[1]), '2': () => console.log(wallet[2]), '3': () => console.log(wallet[3]), '<<< Quit': () => mainMenu() // 点击退出直接重调主菜单,回到初始页 } // 主菜单操作映射表:替代if分支匹配主选项逻辑 const mainActionMap = { 'Wallet': () => accountActionMap[accountOptions](), 'Normal Transaction': () => { const mainswap = require("./mainswap"); mainswap.deploy(); }, 'Arbitrage': () => { // 原有套利逻辑 } } // 执行对应逻辑 mainActionMap[walletOptions](); }) } // 初始化启动主菜单 mainMenu();
关键逻辑说明
.when配置使用:第二个询问项的when函数接收当前已收集的所有答案作为参数,返回布尔值控制当前询问是否展示,完美适配选择Wallet才展示账户列表的需求,无需手动嵌套prompt- 分支逻辑优化:用对象映射表替换所有if/else分支,后续新增选项只需要在对应映射表中添加键值对即可,无需修改分支判断逻辑
- 返回初始页实现:主菜单封装为独立函数,用户点击
<<< Quit时直接重新调用该函数即可回到初始菜单状态
内容的提问来源于stack exchange,提问作者Reece
相关产品推荐
相关产品推荐

