如何从Javascript中的连续函数返回布尔值?

时间:2016-05-14 23:14:14

标签: javascript nested return boolean

我想学习,如何从Javascript中的连续函数返回布尔值?如果上一个函数返回true,我想运行下一个函数。例如,有一个主函数,有3个子函数。

它将是这样的:运行第一个函数,如果它返回true,运行第二个函数,如果第二个函数返回true,运行第三个函数,如果第三个函数返回true,那么main函数也返回true。

有人能告诉我一个简单的例子。我写了一个例子,但它总是返回false :)我想学习逻辑上最好的方法。谢谢大家吧:)

  

我的例子:

var uname;

$("#username").keyup(function() {

    uname = checkUsername();
    console.log(checkUsername());

});     // Username keyup


function allowedChars() {

    var username = document.getElementById("username").value;

    var chars = /^[a-zA-Z0-9\.\_]*$/;

    if(chars.test(username) == true) {

        $("#notName").html("").show();

        return true;

    }

    else {

        $("#notName").html("Username can just contain A-Z, 0-9, dot and underscore!").show();

        return false;

    }

}   //  allowedChars

function unameLen() {

    var username = document.getElementById("username").value;

    if ((username.length > 3) && (username.length < 20)) {

        $("#notName").html("").show();

        return true;

    }

    else {

        $("#notName").html("Username must be between 3 and 20 characters!").show();

        return false;

    }

}

function unameAvl() {

    var username = document.getElementById("username").value;

    $.post("check.php", { username: username },
    function(result){

        if (result == true) {

            $("#notName").html("").show();

            return true;

        }

        else {

            $("#notName").html("Username is already exists!").show();

            return false;

        }

    });

}

function checkUsername() {

    allowedChars();

    if (allowedChars()) {

        unameLen();

    }

    if (unameLen()) {

        unameAvl();

    }

    if (unameAvl()) {

        return true

    }

    else {

        return false;

    }

}

1 个答案:

答案 0 :(得分:3)

您可以使用&&运算符为您执行此操作,因为它实现了短路布尔逻辑。

将您的checkUserName方法更改为此方法并查看其工作原理:

function checkUsername() {
    return allowedChars() && unameLen() && unameAvl();
}

在这种情况下,当allowedChars返回true时,它将接下来调用unameLen。如果unameLen返回true,则会调用unameAvl。如果任何函数返回false,checkUsername函数将返回false,如果它们都返回true,则返回true。

这也将修复unameAvl的返回值,以便返回一个布尔值,而不是未定义。

function unameAvl() {
    var success = false;
    var username = document.getElementById("username").value;

    $.post("check.php", { username: username },
        function() {
            $("#notName").html("").show();

            success = true;
        }
    }).fail(function() {
        $("#notName").html("Username is already exists!").show();

        success = false;
    });

    return success;
}

jQuery的$.post不希望回调成功返回值,因此返回值被丢弃。必须从函数设置unameAvl的返回值,因此它必须通过变量(success)传达该状态。

回调函数的参数也不正确。 jQuery将回调函数的签名记录为Function(PlainObject data, String textStatus, jqXHR jqXHR),但是使用的实际函数具有Function(boolean result)的错误签名。函数参数不会在回调函数中使用,因此可以(并且)安全地省略参数列表。

仅在成功时调用回调,因此还需要提供失败回调。这是通过链接到$.fail调用的$.post方法完成的。

请参阅以下文档页面:

所有这些更改共同使Ajax调用正常工作并正确报告成功状态作为unameAvl的返回值。这正确地允许短路逻辑按预期工作。