Node.js Readline Код паузы

Извините, я только что окунулся в JavaScript и в настоящее время пытаюсь собрать пользовательский ввод с консоли. У меня есть код, который выглядит так:

main = () => {
    var num = getInput();
    console.log(num);
}

getInput = () => {
    const readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    rl.question('Lemme test: ', (ans) => {
        rl.close();
        return ans;
    });
}

main();

Итак, если я попытаюсь запустить это, он покажет:

Lemme test: undefined

а затем подождите, пока я введу. Очевидно, console.log(num); запустился до того, как getInput(); закончился, или getInput(); выдает undefined, а затем запросит ввод.

Кстати переключение rl.close(); и return ans; не работает.

Почему это происходит?


person Mushinako    schedule 30.07.2017    source источник


Ответы (2)


Это произошло из-за того, что Node не ждет, пока readline получит ввод — как почти все в Node, он асинхронный. Таким образом, он запускает запрос на пользовательский ввод и продолжает работу с программой. Как только пользователь вводит какие-либо данные, if запускает обратный вызов, который вы ему дали. Поэтому, чтобы справиться с этим, вам нужно управлять использованием ввода в обратном вызове или иметь функцию, которая вызывается в обратном вызове для асинхронной обработки ввода. Например:

main = () => {
    var num = getInput();
}

dealWithInput = (str) => {
    console.log(str)
}

getInput = () => {
    const readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    rl.question('Lemme test: ', (ans) => {
        rl.close();
        dealWithInput(ans);
    });
}

main();
person Mark    schedule 30.07.2017

Это потому, что функция getInput является обратным вызовом, что означает, что она выполняется в какой-то момент в будущем, поэтому console.log, который не является обратным вызовом, выполняется раньше.

Функция или метод — это обратный вызов, когда вы назначаете его другой функции, например:

let example = () => {
   // This is a callback
}

doSomething(result => {
   // This is a callback too because its the same as doing the following
})

doSomething(function(result){
   // This is a callback without arrow functions
})
person Merunas Grincalaitis    schedule 30.07.2017