Сканеры в 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() для объекта, иначе он будет продолжать читать строки вечно. Почему бы не скачать файл и посмотреть, что получится без закрытия?
Несколько строк (ввод алгоритма)
Иногда, особенно в вопросах алгоритма, вам может понадобиться:
- Читать в несколько строк
- Разобрать ввод, построчно
- Вызовите алгоритм, только когда вы прочитали весь ввод
Для этого воспользуемся событийным подходом.
Функция .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();
Попробуйте здесь.
То, что вы должны знать
- Node имеет библиотеку readline.
- Вы должны сообщить объекту readline, где читать и писать, прежде чем использовать его.
- Используйте метод question(), чтобы запросить у пользователя ввод и запустить функцию на его основе.
- Если вы установили интерфейс, программа зависнет, пока вы не вызовете close().
- Обработка событий осуществляется с помощью метода on(). Следует отметить события «линия» и «закрытие».
- Переключитесь на библиотеку readline-sync для динамических программ.