#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 . Я обновил код. Спасибо, что указали на это. 🙂