2016-05-14 94 views
2

我想學習,如何從Javascript中的連續函數返回布爾值?如果前一個函數返回true,我想運行下一個函數。例如有一個主要功能,並有3個子功能。如何從Javascript中的連續函數返回布爾值?

它會是這樣的:運行第一個函數,如果它返回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; 

    } 

} 
+0

它背後沒有魔法。 – Nonemoticoner

+1

我只是一個新的程序員。你可以更有禮貌。我知道沒有魔法,並感謝您的有用評論。 – yunusus

回答

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)。函數參數不會在回調函數中使用,因此參數列表可以(並且)安全地省略。

回調僅在成功時被調用,因此還需要提供失敗回調。這是通過連接到$.post呼叫的$.fail方法完成的。

看到這些文檔頁:

所有這些變化的同時使Ajax調用的工作,正確報告成功狀態作爲unameAvl的返回值。這正確地允許短路邏輯按預期工作。

+0

謝謝我現在在努力:)對不起,我是一個新的程序員,我第一次看到這個案例。我如何在谷歌上搜索這個案例以瞭解更多信息? – yunusus

+1

如果您搜索「javascript短路」,您會發現一些優秀的示例和說明。 –

+0

我試過你的例子,它的工作原理如果有些東西不行,但是當一切正常時它返回undefined。你知道爲什麼嗎 ? – yunusus