Дождитесь ввода данных пользователем из модуля readline (Node.Js)

Я создаю модуль, чтобы получить опыт и сократить код. У меня есть фрагмент кода, который использует readline упрощенным способом, например var x = arkin.question("How old are you? ");. Readline не ждет ответа. Это производит это:

Сколько тебе лет? неопределенный

Код:

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();
  rl.on('line', (userInput) => {
    response = userInput;
    rl.close();
  });

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

Я называю это так:

var age = arkin.question("How old are you? ");
console.log(age);

Я пробовал использовать этот код:

rl.question(q, (userInput) => {
    rl.close;
    response = userInput;
    return response;
});

Тем не менее, я получаю тот же результат. Заранее спасибо за помощь.


person Arkin Solomon    schedule 30.12.2018    source источник


Ответы (1)


всякий раз, когда вы вызываете arki.question, он регистрирует прослушиватели событий .on("line") и .on("close"), а затем возвращается из функции. Что бы вы ни возвращали из функции прослушивателя событий .on("close") question, она не знает об этом, потому что ее больше нет в стеке вызовов. вы можете использовать обратный вызов или обещания с async...await, чтобы получить результат.

с обратными вызовами

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);
    });
};

ты называешь это так

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

с обещаниями

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);
        });

    });


};

ты называешь это так

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

or

; ( async () => {
    console.log(await arki.question("how old are you? "));
})();
person 0.sh    schedule 30.12.2018
comment
Хорошо, теперь я понимаю, но сделать это так же сложно, как и использовать его обычно. Спасибо за вашу помощь! - person Arkin Solomon; 31.12.2018
comment
вы должны поместить const r1 = readline.createInterface(...) в функцию вопроса, иначе она сработает только в первый раз. - person bruceceng; 19.11.2020