我想根据用户在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();