Javascript根据用户输入调用函数



我想根据用户在JavaScript上的输入调用一个唯一的函数。我使用的是Node.js,而不是HTML输入。我将留下一个示例代码来解释我的通用代码的目标。还有比我更好的方法吗?你向我推荐什么?我不想把所有的新函数都添加到Map中。我也想变成动态的。

let functions = new Map([
      ["Annually", annually],
      ["Daily", daily],
      ["Weekly", weekly],
    ]);   
    async function choice() {
      const answer = await inquirer.prompt({
        name: "choice",
        type: "list",
        message: "How often do you want to get a notification?",
        choices: ["Annually", "Daily", "Weekly"], //Gets choice from users think it's like a HTML form 
      });
      functions.get(answer.choice)(); // Gets the function from map after that calls the function
    }
    
    async function annually() {
       console.log("Annually works.");
    }
    
    async function weekly() {
       console.log("Weekly works.");
    }
    
    async function daily() {
       console.log("Daily works.");
    }

我认为这个解决方案是更好的

const funcs = {
    annually: async () => { // you can change "annually" to anything
        console.log('Annually works.')
    },
    weekly: async () => {
        console.log('Weekly works.')
    },
    daily: async () => {
        console.log('Daily works.')
    },
}
async function choice() {
    const answer = await inquirer.prompt({
        name: 'choice',
        type: 'list',
        message: 'How often do you want to get a notification?',
        choices: Object.keys(funcs),
    })
    await funcs[answer.choice]()
}

完成这项工作的方式似乎是可行的,但我认为有一种更好的方法可以做到这一点,它更可读。

function handleDaily(){
    console.log("daily works");
}
function handleWeekly(){
    console.log("weekly works");
}
function handleAnnually(){
    console.log("annually works");
}
var CHOICE_LIST = [];
const CHOICES = [
    {value: "Daily", handle: handleDaily},
    {value: "Weekly", handle: handleWeekly},
    {value: "Annually", handle: handleAnnually},
];
//Builds choice list based off of CHOICES array
for(let i = 0; i < CHOICES.length; i++){
    CHOICE_LIST.push(CHOICES[i].value);
}
function evalInput(input) {
    for(let i = 0; i < CHOICES.length; i++){
        if(input === CHOICES[i].value){
            CHOICES[i].handle();
            break;
        }
    }
}
async function getChoice(){
    const answer = await inquirer.prompt({
        name: "choice",
        type: "list",
        message: "How often do you want to get a notification?",
        choices: CHOICE_LIST
    });
    evalInput(answer.choice);
}

除非你真的需要,否则不需要将函数存储在映射中。我还从你的函数中删除了async关键字,这些函数不是await

如果这些函数在全局对象的范围内,则可以执行以下操作:

var fn = answer.choice.toString();
if (global[fn] === "function") {
    global[fn]();
  }

如果它在一个模块中,并且您知道该模块导出

var someExports = require('./someExportsFile.js');
Object.keys(someExports)[fn];

PS:

如果这是在浏览器中,你可以使用

var brFn = window[fn)];
if (typeof brFn === "function") brFn();

最新更新