Je crée un programme pour prendre l'entrée de deux nombres à partir de la ligne de commande, puis je montre la somme dans node.js. J'utilise le module readline pour prendre stdin. Voici mon code.
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();
});
Ce programme me montre juste "Veuillez entrer le premier numéro" et quand j'entre un nombre comme 5, il faut aussi 5 pour la deuxième entrée et montre la réponse 10
Il ne pose pas du tout de deuxième question. Veuillez vérifier ceci et me dire quel est le problème. Et s'il existe un meilleur moyen de prendre plusieurs entrées, veuillez le dire.
Je suis un utilisateur novice dans node.js
Le code/rappel imbriqué est terrible à lire et à maintenir, voici une façon plus élégante d'utiliser Promise pour poser plusieurs questions
noeud 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()
Pas besoin d'une autre variable, utilisez simplement comme ceci:
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();
});
});
Je poserais les questions dans une fonction asynchrone et j'envelopperais la ligne de lecture de la même manière que Jason l'a fait ci-dessus. Bien qu'avec un peu moins de code :)
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);
}
vous pouvez utiliser la récursivité:
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)
Pour ceux qui sont intéressés, j'ai mis en place ce petit module qui prend un tableau de questions et renvoie une promesse qui se résout en un tableau de réponses:
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
}
Enregistrez cela dans un fichier appelé ask.js (ou ce que vous voulez) et utilisez comme ceci:
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
});
Remarque: aura besoin d'un transpileur ou d'une version récente de Node car il utilise beaucoup de fonctionnalités ES6.