Как взять два последовательных ввода с модулем 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);
}