javascript – Wait for user input from readline module (Node.Js)

whenever you call arki.question it registeres the event listeners .on(“line”) and .on(“close”) then returns from the function. Whatever you returning from .on(“close”) event listener question function does not know about it, because it is no longer on the call stack. you can either use a callback or promises with async...await to get your result.

with callbacks

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

exports.question = function(q , cb ){

    var response;

    rl.setPrompt(q);
    rl.prompt();

    rl.on('line', (userInput) => {
        response = userInput;
        rl.close();
    });

    rl.on('close', () => {
        return cb(response);
    });
};

you call it like this

var age  = arki.question("how old are you? ", resp => {
    console.log(resp);
});

with promises

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

exports.question = function(q){

    var response;

    rl.setPrompt(q);
    rl.prompt();

    return new Promise(( resolve , reject) => {

        rl.on('line', (userInput) => {
            response = userInput;
            rl.close();
        });

        rl.on('close', () => {
            resolve(response);
        });

    });


};

you call it like this

arki.question("how old are you? ").then( response => console.log(response) );

or

; ( async () => {
    console.log(await arki.question("how old are you? "));
})();

Read more here: Source link