Стандартные ввод/вывод для решения задач на JS
Решил порешать простые задачки на JS, то бишь на Node.JS, столкнулся с проблемой ввод/вывод. Нашел способ readline. Задачку по выводу суммы двух вводных чисел решил так:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const arr = [];
rl.on('line', line => {
arr.push(line);
if(arr.length === 2) {
console.log(Number(arr[0]) + Number(arr[1]));
rl.close();
}
})
И мне кажется это ооочень некрасиво! Мне кажется, что я не до конца разобрался с этим readline, а может быть даже с JS, я просто привык в C# просто ввел string a = Console.ReadLine(); и дальше работай себе спокойно с этой переменной. Но тут не могу догадаться как можно красивей сделать. Еще увидел работу с командной строкой node.js, там есть process.argv, с ним всё понятно и вот как раз уже похоже на правду, но для него нужно передать числа сразу же при вызове node. Так вот, мой вопрос: правильно ли я понял, что стандартный ввод/вывод для задачек на node.js - это readline? И если да, то не подскажите, пожалуйста, как улучшить мой код? А то как-то меня смущает работа с массивом да и вообще куча строчек для такой маленькой задачи.
Ответы (1 шт):
И мне кажется это ооочень некрасиво!
Вполне нормально.
я просто привык в C# просто ввел string a = Console.ReadLine(); и дальше работай себе спокойно с этой переменной
Да, но там поток выполнения заблокирован ожиданием пользовательского ввода, а вот нода, без всяких ухищрений, ожидая ввод, может выполнить ещё мириады полезных вещей - обслужить поступившие запросы, сбегать до Луны за пивом, почистить зубы, поспать, получить ввод, запросить следующий, обслужить запрос.
Ожидание события не блокирует процесс.
Так вот, мой вопрос: правильно ли я понял, что стандартный ввод/вывод для задачек на node.js - это readline?
Ну, да. Но таких задачек в жизни мало.
И если да, то не подскажите, пожалуйста, как улучшить мой код?
В вашем коде есть скрытое потенциальное затруднение: никто не узнает что что-то произошло в callback. Прочите это, чтобы понимать проблему и пути решения.
А код, в 2021году, можно улучшить переписав всё на async-await
// @ts-check
const readline = require('readline');
(async () => {
const limit = 2;
const arr = [];
while (1) {
try {
const str = await ask(`Введите число #${1 + arr.length}: `);
const number = +str;
if (!Number.isNaN(number)) {
arr.push(number);
}
if (arr.length === limit) {
break;
}
} catch (err) {}
}
const sum = arr.reduce((acc, x) => acc + x, 0);
console.log(sum);
})();
/**
* @param {string} question
* @returns {Promise<string>}
*/
async function ask(question) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
return new Promise((resolve, reject) => {
rl.question(question, (answer) => {
rl.close();
if (answer === null || answer === undefined || !/\S/.test(answer)) {
return reject();
}
resolve(answer);
});
});
}