Ожидание ввода данных от модуля readline (Node.Js) - PullRequest
0 голосов
/ 30 декабря 2018

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

Сколько тебе лет?undefined

Код:

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

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

1 Ответ

0 голосов
/ 30 декабря 2018

всякий раз, когда вы вызываете 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) );

или

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