Как взять два последовательных ввода с модулем readline node.js?
Я создаю программу для ввода двух чисел из командной строки, а затем покажу там сумму в node.js. Я использую модуль readline для принятия stdin. Ниже мой код.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const r2 = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Please enter the first number', (answer1) => {
r2.question('Please enter the second number', (answer2) => {
var result = (+answer1) + (+answer2);
console.log('The sum of above two numbers is ${result}');
});
rl.close();
});
Эта программа просто покажет мне "Пожалуйста, введите первый номер", и когда я ввожу число, подобное 5, оно также принимает 5 для второго ввода и показывает ответ 10
Он не задает второй вопрос вообще. Пожалуйста, проверьте это и скажите мне, в чем проблема. И если есть лучший способ сделать несколько ввода, сообщите об этом.
Я новичок в node.js
Ответы
Ответ 1
Вложенный код/обратный вызов ужасны для чтения и обслуживания, здесь более элегантный способ использовать Promise для запроса нескольких вопросов
узел 8+
'use strict'
const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
const question1 = () => {
return new Promise((resolve, reject) => {
rl.question('q1 What do you think of Node.js? ', (answer) => {
console.log('Thank you for your valuable feedback: ${answer}')
resolve()
})
})
}
const question2 = () => {
return new Promise((resolve, reject) => {
rl.question('q2 What do you think of Node.js? ', (answer) => {
console.log('Thank you for your valuable feedback: ${answer}')
resolve()
})
})
}
const main = async () => {
await question1()
await question2()
rl.close()
}
main()
Ответ 2
Нет необходимости в другой переменной, просто используйте вот так:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Please enter the first number : ', (answer1) => {
rl.question('Please enter the second number : ', (answer2) => {
var result = (+answer1) + (+answer2);
console.log('The sum of above two numbers is ${result}');
rl.close();
});
});
Ответ 3
Для тех, кого это касается, я собрал этот маленький модуль, который принимает множество вопросов и возвращает обещание, которое решает массив ответов:
const readline = require('readline');
const AskQuestion = (rl, question) => {
return new Promise(resolve => {
rl.question(question, (answer) => {
resolve(answer);
});
});
}
const Ask = function(questions) {
return new Promise(async resolve => {
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let results = [];
for(let i=0;i < questions.length;i++) {
const result = await AskQuestion(rl, questions[i]);
results.push(result);
}
rl.close();
resolve(results);
})
}
module.exports = {
askQuestions: Ask
}
Сохраните это в файле ask.js (или как вам нравится) и используйте вот так:
const { askQuestions } = require('./ask');
askQuestions([
'What is question 1?',
'What is question 2?',
'What is question 3?'
])
.then(answers => {
// Do whatever you like with the array of answers
});
Примечание: потребуется транспилер или последняя версия узла, поскольку он использует множество функций ES6.
Ответ 4
Вы можете использовать рекурсию:
var fs = require('fs')
var readline = require('readline')
rl = readline.createInterface({
input : process.stdin,
output : process.stdout
});
var keys = []
function gen(rank){
if(rank > 3)
{
//do whatever u want
var sum_avg = 0
for (i in keys)
{
sum_avg+=Number(keys[i])
}
console.log(sum_avg/3);
return -1;
}
else
{
var place = rank>1 ? "th" : "st"
var total = rank+place
rl.question("Please enter the "+total+ " number :",function(answer){
keys.push(answer)
//this is where the recursion works
gen(rank+1)
})
}
}
//pass the value from where you want to start
gen(1)
Ответ 5
Я задавал вопросы в асинхронной функции и переносил readline так же, как это делал Джейсон выше. Хотя с немного меньшим количеством кода :)
const readline = require('readline');
rl = readline.createInterface({
input : process.stdin,
output : process.stdout
});
function question(theQuestion) {
return new Promise(resolve => rl.question(theQuestion, answ => resolve(answ)))
}
async function askQuestions(){
var answer = await question("A great question")
console.log(answer);
}