Мне нужно спросить, сколько входных данных пользователь хочет дать (один ввод в строке) и прочитать их.
Я стараюсь сделать его максимально простым, не используя никаких библиотек или даже async
. Почему? Потому что я провожу курс на Coursera и мне нужно загрузить файл JavaScript/Node в качестве задания. Тот, который я написал с async
и promise
, был отклонен (эту версию смотрите в конце этого поста). Почему-то не работает ввод и вывод с "системой Курсера".
Поэтому я пытаюсь сделать это без всяких наворотов:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
terminal: false
});
const r2 = readline.createInterface({
input: process.stdin,
terminal: false
});
let x = null;
let y = [];
rl.on('line', line1 => {
if (line1 !== "\n") {
x = parseInt(line1);
while(x > 0){
r2.on('line', line2 => {
y.push(line2);
});
x -= 1;
}
console.info('You entered these colors:', y);
process.exit();
}
});
Выход:
3
You entered these colors: []
Ожидаемый результат:
[input]3
[input]green
[input]blue
[input]red
[output]You entered these colors: ["green", "blue", "red"]
Тот, который работал, но отказался купить «систему заданий» Coursera:
const readline = require('readline');
const readLineAsync = () => {
const rl = readline.createInterface({
input: process.stdin,
terminal: false
});
return new Promise((resolve) => {
rl.prompt();
rl.on('line', (line) => {
rl.close();
resolve(line);
});
});
};
async function start() {
let line = null;
let colors = [];
line = await readLineAsync();
const numColors = parseInt(line);
for(let count = numColors; count > 0; count--) {
line = await readLineAsync();
colors.push(line);
}
console.info('You entered these colors:', colors);
}
start();
Изначально мы хотим спросить, сколько цветов пользователь собирается ввести. Мы уверены, что ввод ожидается только один раз, поэтому используется r1.once()
.
Но количество раз, которое мы запрашиваем у пользователя ввод, зависит от предыдущего ввода. Поэтому мы используем r1.on()
который не закроется, пока не будет прекращено. Мы будем использовать переменную counter
, чтобы гарантировать, что ввод запрашивается у пользователя необходимое количество раз.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
terminal: false
});
process.stdin.setEncoding('utf8');
rl.once('line', line => {
const count = parseInt(line.toString());
const colors = [];
let counter = 0;
rl.on('line', line => {
const color = readLine(line);
colors.push(color);
if (++counter >= count) {
console.info('You have entered these colros:', colors);
process.exit();
}
});
});
function readLine(line) {
return line.toString();
}
выход
3
red
green
blue
You have entered these colros: [ 'red', 'green', 'blue' ]