Как вырваться из вложенных циклов в функциях (javascript)

#javascript #node.js

Вопрос:

Многие ответы, которые я читал, не имеют функций. Однако мне абсолютно необходимо включить функции in в свой сценарий.

 var input = require('readline-sync')
var cart = [];
function func2() {
    console.log("this is the inner function")
    while (true) {
        firstinput = input.questionInt('Please Enter your input (1, 2, 3). Press 0 to Go back to outermost loop. You will still be in the program.')
        switch (firstinput) {
            case 0: 
                break; //breaks out of this entire func2()
            case 1: 
                func3()
                break; //breaks, but goes back to firstinput
            case 2:
                func4() //im not going to define it here, but similar to func3()
                func5() //im not going to define it here, but similar to func3()
                break;
            case 3:
                func5() 
                func3() //as you can see, the functions are recurring
                break;
            default:
                console.log('Input valid number, please')
                continue;
        }
    }
}

function func3() {

    while (true) {
        secondinput = input.question("Hi, please pick 1a, 1b, or 1c! You can Press 0 to exit to the outermost function. YOu will still be in the program, though")
        switch (secondinput) {
            case '0':
                break; //breaks out of func3() and func2()
            case '1a':
                cart.push("1a")
                break; //breaks out of func3()
            case '1b':
                cart.push("1b")
                break; //breaks out of func3()
            case '1c':
                cart.push('1c')
                break; //breaks out of func3()
            default:
                console.log('invalid input')
                continue;
        }
        
    }
}
function func1() {
    while (true) {
        func2()
        if ((secondinput == 0) || (firstinput == 0)) {
            console.log("I see you've pressed 0. Let's loop through again")
        }
        else {
            console.log('Here is what was in your cart: '   cart)
        }
    }

}

func1()
 

Надеюсь, это было ясно! Мне нужно вырваться из внутренних функций и внешних функций. это сложно, потому что, если я изменил значение переменной в функции, значение снаружи не изменится.

Заранее спасибо

мой вопрос: когда я войду в func3(), как мне вырваться из всего, если я нажму «0»?

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

1. Использование break таким образом должно привести только к разрыву текущего цикла. Я не мог поверить, что break в вашем switch at func2 ведет себя по-другому.

Ответ №1:

Вы можете вернуться, когда захотите остановить функцию или продолжить цикл.

 while (true) {
    firstinput = input.questionInt('Please Enter your input (1, 2, 3). Press 0 to Go back to outermost loop. You will still be in the program.')
    switch (firstinput) {
        case 0: 
            return; //breaks out of this entire func2()
        case 1: 
            func3()
            continue; //breaks, but goes back to firstinput
        case 2:
            func4()
            func5() 
            continue;
        case 3:
            func5() 
            func3() //as you can see, the functions are recurring
            continue;
        default:
            console.log('Input valid number, please')
            continue;
    }
}
 

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

1. Однако, когда я попадаю в функцию func3 (), как мне нажать 0, чтобы вернуться к началу?

2. случай 0: функция возврата func1();

Ответ №2:

Вы должны использовать комбинацию возврата/разрыва/продолжения, как здесь

 // var input = require('readline-sync')
var cart = [];
let firstinput, secondinput;
function func2() {
    console.log("this is the inner function")
    while (true) {
        firstinput =  prompt('Please Enter your input (1, 2, 3). Press 0 to Go back to outermost loop. You will still be in the program.')
        console.log({firstinput})
        switch (firstinput) {
            case 0: 
                return; //breaks out of this entire func2()
            case 1: 
                func3()
                break; //breaks, but goes back to firstinput
            case 2:
                func4() //im not going to define it here, but similar to func3()
                func5() //im not going to define it here, but similar to func3()
                break;
            case 3:
                func5() 
                func3() //as you can see, the functions are recurring
                break;
            case 4: // show cart
            case -1: // exit everything
                return;
            default:
                console.log('Input valid number, please')
                continue;
        }
    }
}

function func3() {

    while (true) {
        secondinput = prompt("Hi, please pick 1a, 1b, or 1c! You can Press 0 to exit to the outermost function. YOu will still be in the program, though")
        switch (secondinput) {
            case '0':
                return false; //breaks out of func3()
            case '1a':
                cart.push("1a")
                return true; //breaks out of func3()
            case '1b':
                cart.push("1b")
                return true; //breaks out of func3()
            case '1c':
                cart.push('1c')
                return true; //breaks out of func3()
            default:
                console.log('invalid input')
                continue;
        }
        
    }
}
function func1() {
    while (true) {
        func2()
        if ((secondinput == 0) || (firstinput == 0)) {
            console.log("I see you've pressed 0. Let's loop through again")
        } else if(firstinput === -1) {
          return
        }
        else {
            console.log('Here is what was in your cart: '   cart)
        }
    }

}

func1() 

Вы также можете использовать помеченный разрыв для выхода из такого блока

 let i=0
a: while(true){
    i
  switch(i) {
    case 4:
      break a; // break the while loop
    default:
      console.log(i);
  }
}
// prints
// 1
// 2
// 3
 

Для получения дополнительной информации о помеченном разрыве проверьте это

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

1. спасибо за ваш ответ, но мне нужны функции, поэтому мне нужно, чтобы они были закодированы таким образом, чтобы, если я нажму 0 в функции func3() [которая является внутренней функцией ВНУТРЕННЕЙ функции], она дойдет до самого внешнего цикла и напечатает «Я вижу, что вы нажали 0. Давайте пройдем еще раз».