Сканеры в Java, readline() в Python, scanf() в C. Как это делается в JavaScript?

Мы будем работать с Node в терминале, таком как cmd, bash или терминал Visual Studio Code. Возможно, вы запускаете свою программу с помощью:

node file-name.js

Вы можете получить примеры кода и запустить их здесь.

Настраивать

Начнем с импорта библиотеки readline:

const readline = require('readline');

Прежде чем использовать этот объект, нам нужно определить интерфейс для его использования.

Для этого нам нужен один поток доступный для чтения и один поток доступный для записи. Мы могли бы создать эти файлы или другие объекты, но сегодня мы будем использовать stdin и stdout Node, которые являются свойствами объекта Node process.

Мы поместим их в литерал объекта в виде пар ключ-значение.

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

Подсказка для строки (добавление пяти)

Теперь все, что нам нужно сделать, это сказать нашему объекту, чтобы он запрашивал у пользователя ввод и говорил ему, что с ним делать.

Метод readline method question() принимает запрос в своем доступном для записи потоке, за которым следует функция обратного вызова, сообщающая readline, что делать с полученной строкой.

r1.question('Give me a number, I\'ll add five! ', function(num) {
    
    // Tell JS this is a number
    num = parseInt(num);
    console.log(num + 5);
    // Close, or it will keep reading forever
    r1.close();
})

Нам понадобится .close() или .pause() для объекта, иначе он будет продолжать читать строки вечно. Почему бы не скачать файл и посмотреть, что получится без закрытия?

Несколько строк (ввод алгоритма)

Иногда, особенно в вопросах алгоритма, вам может понадобиться:

  1. Читать в несколько строк
  2. Разобрать ввод, построчно
  3. Вызовите алгоритм, только когда вы прочитали весь ввод

Для этого воспользуемся событийным подходом.

Функция .on() в Readline принимает два аргумента: событие и функцию обратного вызова. Нажмите на ссылку и посмотрите на некоторые события, которые вы можете использовать.

Давайте настроим функцию, которая читает строки, а затем сохраняет ввод в массиве, пока он не станет слишком длинным.

Мы скажем readline, что делать в событии «строка», которое запускается, когда виден символ новой строки (вы нажимаете ввод в терминале), с самой строкой в ​​качестве аргумента.

let inputNumbers = [];
r1.on('line', function(line) {
    // Put the number in an array
    inputNumbers.push(parseInt(line));
   // Stop when the array is 5 numbers long
   if (inputNumbers.length == 5) {
       r1.close();
   }
});

Попробуем записать наш массив.

console.log(inputNumbers);

В консоли:

node test.js
[]
1
2
3
4
5

Uh-oh!

К сожалению, мы не сказали JavaScript, что ему нужно закончить чтение ввода перед печатью массива, поэтому он забегает вперед и печатает его, пока он еще пуст.

Посмотрим. Когда массив достигает длины 5, он вызывает r1.close(), что вызывает событие close. Итак, вместо того, чтобы вести журнал напрямую, давайте сделаем это в событии «закрыть»!

r1.on(‘close’, function() {
    // Put your algorithm here. You have access to inputNumbers
    // and can be assured all the inputs are in.
    console.log(inputNumbers);
});

Это работает именно так, как вы ожидаете. Вот полная программа.

Ответ на ввод во время программы (генератор четных чисел)

В заключение мы напишем программу, которая реагирует по-разному в зависимости от ввода с терминала. Вы можете использовать это для игры, обработки ошибок или любой другой динамической программы.

В качестве примера, давайте напишем скрипт, который печатает четные числа, но мы спросим пользователя, хотят ли они продолжать с каждым числом, кратным десяти.

Это проблематично, потому что Node продолжит выполнять другой код, даже если пользователь не ввел данные.

Один из подходов к синхронному использованию ввода-вывода — это библиотека readline-sync. Установите его из терминала с помощью:

npm install readline-sync

Вместо импорта readline начните с:

const readline = require('readline-sync');

Нам не нужно настраивать интерфейсы. Просто вызовите .question(), и Node будет ждать нашего ввода.

function main() {
    count = 0;
    while(true) {
        count += 2;
        console.log(count);
        // If a multiple of ten
        if (count % 10 == 0) {
            answer = readline.question('Continue? Y or N: ');
            if (answer == 'N') {
                // Stop generating numbers
                break;
            }
        }
    }
}
main();

Попробуйте здесь.

То, что вы должны знать

  1. Node имеет библиотеку readline.
  2. Вы должны сообщить объекту readline, где читать и писать, прежде чем использовать его.
  3. Используйте метод question(), чтобы запросить у пользователя ввод и запустить функцию на его основе.
  4. Если вы установили интерфейс, программа зависнет, пока вы не вызовете close().
  5. Обработка событий осуществляется с помощью метода on(). Следует отметить события «линия» и «закрытие».
  6. Переключитесь на библиотеку readline-sync для динамических программ.