node js: есть ли аналог cin >> n; из c++?
Я хочу подучить работу с js при помощи сайта https://practice.geeksforgeeks.org/.
Там есть возможность сдавать простые задачки (ну, типа, "найти сумму элементов массива") на платформе node.js, и это здорово!
Попробуем решить перую задачу: "в первой строке вводится число элементов N. Затем вводится N целых чисел . Напечатайте их сумму"
Но есть небольшая проблема.
я не умею вводить с консоли что то в ноду. Выводить - умею, есть console.log().
Пробую самый простой способ:
console.log('input n:');
var n = process.stdin.read();
console.log('n*n:');
console.log(n*n);
После запуска этого файла в ноде - результат пародоксальный: нода, не останавливаясь на ввод строки, пишет:
node app.js
input n:
n*n:
0
и... повисает. Не знаю, чего уж она там ждет, я прервал её ctrl-с.
Гуглю дальше.
Нахожу пример:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('What do you think of Node.js? ', (answer) => {
console.log(`Thank you for your valuable feedback: ${answer}`);
rl.close();
});
- и вижу, что это пример мою проблему не решает.
А как его поменять, если мне надо ввести две строки? А если надо ввести что то в цикле?
Конечно, я могу попробовать завести глобальные переменные, котрые будут в этом question менять вопрос и записывать переменную answer в какой то вектор, а еще изобрести машину состояний, чтобы понять, когда пора это процесс прекратить... но как то это уже очень стрельба из пушки по воробьям. не должно быть так сложно.
В общем, я понимаю, что без какого то аналога ввода с клавиатуры типа cin >> x; в c++ я не могу выполнить ни одного учебного примера, и примера такого ввода тоже найти не могу.
почитал про библиотеку promt, и изучил похожий вопрос - но фактически там нет ответа на вопрос: там есть ссылка на 2 места в документации, и нет примера, как эти функции применить для решения моей задачи.
Не подскажете ли Вы мне такой пример?
Заранее спасибо!
Ответы (1 шт):
Вот так это делается на чистом node.js:
// @ts-check
const readline = require('readline');
(async () => {
try {
const count = await askInteger('Введите количество элементов: ');
const arr = [];
while (arr.length < count) {
try {
const number = await askInteger(`Введите число #${1 + arr.length}: `);
arr.push(number);
} catch (err) {}
}
const sum = arr.reduce((acc, x) => acc += x, 0);
console.log(sum);
} catch (err) {
console.error(err);
}
})();
/**
* @param {*} question
* @returns {Promise<number>}
*/
async function askInteger(question) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
return new Promise((resolve, reject) => {
rl.question(question, (answer) => {
rl.close();
/** @type {number} */
let number;
if (answer !== null && answer !== undefined && answer !== '') {
number = +answer;
}
return Number.isInteger(number) ? resolve(number) : reject('INCORRECT_INPUT');
});
});
}
Версия на callback-ах:
// @ts-check
const readline = require('readline');
run();
function run(){
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
askInteger(rl, 'Введите количество элементов: ', (count) => {
fillArray(rl, count, undefined, (arr) => {
rl.close();
const sum = arr.reduce((acc, x) => acc += x, 0);
console.log(sum);
});
});
}
function fillArray(rl, count, arr=[], cb) {
askInteger(rl, `Введите число #${1 + arr.length}: `, (number) => {
arr.push(number);
if (arr.length !== count) {
fillArray(rl, count, arr, cb);
} else {
cb(arr);
}
});
}
function askInteger(rl, question, cb) {
rl.question(question, (answer) => {
/** @type {number} */
let number;
if (answer !== null && answer !== undefined && answer !== '') {
number = +answer;
}
if (Number.isInteger(number)) {
cb(number);
} else {
console.warn('INCORRECT_INPUT');
askInteger(rl, question, cb);
}
});
}
console.log('input n:');
var n = process.stdin.read();
console.log('n*n:');
console.log(n*n);
После запуска этого файла в ноде - результат парадоксальный: нода, не останавливаясь на ввод строки, пишет и... повисает. Не знаю, чего уж она там ждет, я прервал её ctrl-с.
process.stdin - это stream (фундаментальная штука в node.js).
process.stdin.on('data', (chunk) => {
console.log(chunk);
});
Почитайте https://nodejs.org/dist/latest/docs/api/stream.html - самый интересный раздел документации