0

Решил порешать простые задачки на 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? И если да, то не подскажите, пожалуйста, как улучшить мой код? А то как-то меня смущает работа с массивом да и вообще куча строчек для такой маленькой задачи.

Kromster
  • 13,809
  • https://ru.stackoverflow.com/questions/1214723/node-js-%d0%b5%d1%81%d1%82%d1%8c-%d0%bb%d0%b8-%d0%b0%d0%bd%d0%b0%d0%bb%d0%be%d0%b3-cin-n-%d0%b8%d0%b7-c/1214972#1214972 – nörbörnën Jan 21 '21 at 15:06

1 Answers1

0

И мне кажется это ооочень некрасиво!

Вполне нормально.

я просто привык в 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); }); }); }

nörbörnën
  • 12,192
  • 5
  • 29
  • 40