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

Posted

技术标签:

【中文标题】如何从 Javascript 中的连续函数返回布尔值?【英文标题】:How can I return boolean value from consecutive functions in Javascript? 【发布时间】:2016-09-10 23:57:41 【问题描述】:

我想学习,如果上一个函数返回 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】:

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

将您的 checkUserName 方法更改为此,看看它是如何工作的:

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

在这种情况下,当allowedChars 返回真时,它会下一次调用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)。函数参数不会在回调函数中使用,因此参数列表可以(并且是)安全地省略。

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

查看这些文档页面:

jQuery $.post jQuery jqXHR object(失败回调) jQuery $.ajax

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

【讨论】:

谢谢我现在正在尝试:) 对不起,我是一个新程序员,我第一次看到这个案例。如何在 google 上搜索此案例以了解更多信息? 如果你搜索“javascript short circuit”,你会发现一些很好的例子和描述。 我尝试了您的示例,如果出现问题,它可以工作,但是当一切正常时,它返回未定义。你知道为什么吗? 好的,情况是unameAvl没有返回true或false,只有$.post的回调方法返回了一个布尔值。 unameAvl 的返回值未定义,因为该函数中没有返回值。我将在我的答案中包括如何解决这个问题。 你的回答太棒了!一切都好。非常感谢,现在我必须了解更多关于 ajax 的信息 :)

以上是关于如何从 Javascript 中的连续函数返回布尔值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将从函数返回的布尔值分配给 PostgreSQL 9.4 中的变量?

初学者问题:从 Python 中的函数返回布尔值

如何从订阅另一个函数的observable的函数返回布尔值?

调用返回布尔值的JavaScript函数

如何从javascript中的去抖动函数返回值? [复制]

如果数组中的所有值都为真(字符串)并且其中一个值为假(字符串),则如何返回布尔值 true 停止使用 Javascript 进行检查