Элемент управления не прекращает принимать входные данные и работает в бесконечном цикле

#javascript #node.js

#javascript #node.js

Вопрос:

В приведенной ниже программе я создал два файла: один, который экспортирует модули, и другой файл, который использует эти модули в случае переключения, моя цель здесь — создать базовую программу калькулятора с использованием switch case, где пользователю разрешено вводить данные более одного раза, для этого я использовал бесконечныйцикл while, но проблема в строке prompt.get() сразу после while(1) управление программой не прекращает принимать входные данные от пользователя и продолжает работать в бесконечном цикле. Чтобы конкретно указать на эту строку, я поместил над ней комментарий.

math.js

 module.exports={
    add:function(a,b)
    {
        return a b;
    },
    sub: (a,b)=> a-b,
    divide: (a,b) => a/b,
    multiply: (a,b) => a*b
}


'another js file.'        

    const math=require('./math');
    const prompt=require('prompt');
    prompt.start();
console.log("n1.Addn2.Substractn3.Dividen4.Multiplyn5.ExitnEnter your choice (1-5):n");
    while(1)
    {
      //here control of program is not stopping to take input and it continuously going on in a infinite loop
        prompt.get([{
            name: 'firstNumber',
            type: 'number'
        },{
            name: 'secondNumber',
            type: 'number'
        }],function(err,result){
            if(err) {onErr(err);}
            prompt.get({
                name:'choice',
                type: 'number'
            },function(err,result){
                if(err){ onErr(err)}
                switch(result.choice)
                {
                    case 1: 
             console.log("sum is " math.add(result.firstNumber,result.secondNumber));
                    break;
                    case 2:                       
             console.log(`Substraction is ${math.sub(result.firstNumber,result.secondNumber)}`);
                    break;
                    case 3:                        
             console.log(`Division is ${math.divide(result.firstNumber,result.secondNumber)}`);
                    break;
                    case 4: 
      console.log(`multiplication is ${math.multiply(result.firstNumber,result.secondNumber)}`)
                    break;
                    case 5: process.exit(0);
                    default: console.log("You had entered invalid choice.");
                    break;
                }
            })
        });
        } 
    function onErr(err)
    {
        console.log(err);
        return 1;
    }
  

Ответ №1:

Цикл while переходит в бесконечный цикл, потому что переданное в нем значение всегда равно true. Для вашего требования я предлагаю использовать рекурсию. Я вставляю рабочий код ниже. Дайте мне знать, если это сработает.

 const math = require('./math');
const prompt = require('prompt');
prompt.start();
console.log("n1.Addn2.Substractn3.Dividen4.Multiplyn5.ExitnEnter your choice (1-5):n");

takeInputs()

function takeInputs () {
  prompt.get([{
    name: 'firstNumber',
    type: 'number'
  }, {
    name: 'secondNumber',
    type: 'number'
  }], function (err, result) {
    if (err) { onErr(err); }
    prompt.get({
      name: 'choice',
      type: 'number'
    }, function (err, data) {
      if (err) { onErr(err) }
      switch (data.choice) {
        case 1:
          console.log("sum is "   math.add(result.firstNumber, result.secondNumber));
          return takeInputs()
        case 2:
          console.log(`Substraction is ${math.sub(result.firstNumber, result.secondNumber)}`);
          return takeInputs()
        case 3:
          console.log(`Division is ${math.divide(result.firstNumber, result.secondNumber)}`);
          return takeInputs()
        case 4:
          console.log(`multiplication is ${math.multiply(result.firstNumber, result.secondNumber)}`)
          return takeInputs()
        case 5: process.exit(0);
        default: console.log("You had entered invalid choice.");
          return takeInputs()
      }
    })
  });
}

function onErr (err) {
  console.log(err);
  return 1
}
  

Комментарии:

1. Спасибо, код работает нормально, но есть одна вещь, которая меня беспокоит, вы реализовали рекурсию и прерывание как в случае переключения, так как java script — это язык с потерями, поэтому ошибка не возникает, иначе это может быть проблематично.

2. Вы правы. Мы можем напрямую возвращать вызов функции, не нужно использовать break . Я обновил код. Спасибо, что указали на это. 🙂