如果发生无效输入,如何使函数返回到某个位置

How to make the function return to a certain place if invalid input takes place?

本文关键字:返回 函数 位置 何使 无效 输入 如果      更新时间:2023-09-26

我有一个函数

function Choice(options) {
wait()
    function wait(){ // only proceed after a selection is made;
        selection = parseInt(selectedchoice);
        if (selection < 1){
            setTimeout(wait,1000);
            console.log("Not chosen yet");
            selection = parseInt(selectedchoice);
        } 
        else if (selection == 1 || selection == 2){
            // Finding what the user selected
            for (var i in options.choices) {
                m++
                if (m === selection){
                    //console.log("PICK IS " + i);
                    pick = i;
                    break
                }
            }
            console.log(options.choices[pick].condition)
            if (selection >= options.choices.length || selection <= 0 || options.choices[pick].condition === false ) {
                selection = 0;
                //Choice(options);
                console.log("Invalid selection");
//USE MAGIC HERE

            }
            else {
                   console.log("Valid selection");
            }
        }
    }
}

如果用户选择了一个无效的选择,他应该被告知这一点,并向后扔一点以再次选择。显然,即使在将selection重置为0之后,再次调用函数Choice(options)也会导致无限递归。投掷也是如此(尽管我不知道如何正确使用它们)。

问题是:如果发生错误,如何让程序再次执行函数Choice()?

if更改为while

这样。当没有选择发生时,代码停留在这个块上,只有当用户选择时才继续

function Choice(options) {
wait()
 function wait() { // only proceed after a selection is made;
    selection = parseInt(selectedchoice);
    while (selection !== 1 || selection !== 2 ) {
        selection = parseInt(selectedchoice);
    }
    // Finding what the user selected
    for (var i in options.choices) {
        m++
        if (m === selection) {
            //console.log("PICK IS " + i);
            pick = i;
            break
        }
        console.log(options.choices[pick].condition)
        if (selection >= options.choices.length || selection <= 0 || options.choices[pick].condition === false) {
            selection = 0;
            //Choice(options);
            console.log("Invalid selection");
            //USE MAGIC HERE
        } else {
            console.log("Valid selection");
        }
    }
}

我认为你处理这个问题的方法是错误的。您不应该使用setTimeout来"监视"值的更改;相反,您应该让您的逻辑由事件驱动。

在这种情况下,您希望将change[doc]事件处理程序附加到您的select元素。无论何时调用事件处理程序,您都会确信select元素的值已更改,然后您就可以对用户的选择执行相应的操作。例如,

HTML:

<select id="select" onchange="onSelectChange()">
    <option value="0">Please choose...</option>
    <option value="1">Value 1</option>
    <option value="2">Value 2</option>
</select>

JS:

function onSelectChange() {
    var selection = document.getElementById('select').value;
    if (/* selection is valid */) {
        // do whatever you need to do for a vaild selection
    } else {
        // selection is invalid, you want to notify user invalid
        // selection by using "alert" or something like that, and
        // you're DONE!
    }
}

这样,如果选择无效,用户可以再次选择,并且一旦用户做出不同的选择,处理程序再次运行。