Skip to content
Advertisement

Function recursion advice

I am building an employee tracking app. I want my app to work so that after each one of the functions for the various list selections is complete, the app will re-prompt you with the options list again. There are a few methods I can think of to achieve this but I was hoping a more seasoned developer could recommend which method is the best. Thanks!

  1. make all the functions in the switch statements into promises and then make a promise chain that recalls itself
  2. try and use async-await instead of a promise chain???
  3. export the prompt() function and import it and all the other corresponding functions in each lib file

here is the entry point of the app

const db = require('./db/connection');
const inquirer = require('inquirer');

// response handling 
const { viewDepartments, viewRoles, viewEmployees, viewByManager, viewByDepartment } = require('./lib/viewFuncs');
const { addDepartment, addRole, addEmployee } = require('./lib/addFuncs');
const { updateRole, updateManager } = require('./lib/updateFuncs');
const { deleteDepartment, deleteRole, deleteEmployee } = require('./lib/deleteFuncs');

function prompt() {
    return inquirer.prompt({
        name: 'choice',
        type: 'list',
        message: 'What would you like to do?',
        choices: [
            'View all departments', 
            'View all roles', 
            'View all employees',
            'View employees by manager',
            'View employees by department', 
            'Add a department', 
            'Add a role',
            'Add an employee', 
            'Update an employee role',
            'Update employee manager',
            'Delete a department',
            'Delete a role',
            'Delete an employee',
            'EXIT'
        ]
    }).then(answer => {
        switch (answer.choice) {
            case 'View all departments':
                viewDepartments();
                break;
            case 'View all roles':
                viewRoles();
                break;
            case 'View all employees':
                viewEmployees();
                break;
            case 'View employees by manager':
                viewByManager();
                break;
            case 'View employees by department':
                viewByDepartment();
                break;
            case 'Add a department':
                addDepartment();
                break;
            case 'Add a role':
                addRole();
                break;
            case 'Add an employee':
                addEmployee();
                break;
            case 'Update an employee role':
                updateRole();
                break;
            case 'Update an employee manager':
                updateManager();
                break;
            case 'Delete a department':
                deleteDepartment();
                break;
            case 'Delete a role':
                deleteRole();
                break;
            case 'Delete an employee':
                deleteEmployee();
                break;
            case 'EXIT': 
                exitApp();
                break;
            default:
                break;
        }
    })
};
// connect to database 
db.connect(err => {
    if (err) throw err;
    console.log('Welcome to the employee-tracker!');
    // start the app 
    prompt();
});
// exit the app
function exitApp() {
    console.log('Thank you for using the employee-tracker!')
    db.end();
};

Advertisement

Answer

I think the switch statement is overkill. If you create an object where the key is the option and the function is the value then it is a 1:1 lookup and hypothetically more performant.

Additionally, drop the then statements because we write modern code here. Also congrats on the internship.

const choiceObj = {
            'View all departments':viewDepartments(), 
            'View all roles':viewAllRoles(), 
            ...etc etc 
}

const prompt = async () => {
    const answer = await inquirer.prompt({
        name: 'choice',
        type: 'list',
        message: 'What would you like to do?',
        choices: Object.keys(choiceObj) // returns an array of the object keys
    })

    if (answer) {
       choiceObj[answer]; 

       alert('answer submitted'); // UX++
       setTimeout(function(){
         prompt(); // recursion after 2s
       }, 2000);
    }
};

I can answer any questions in the comment section. Thanks!

Advertisement