web-dev-qa-db-fra.com

Comment prendre deux entrées consécutives avec le module readline de node.js?

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

14
Puneet Singh

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()
25
jc1

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();
    });
});
17
Thamilan

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);
}
1
user3032538

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)
0
serious_luffy

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.

0
Jason