使用回调函数从异步请求返回值

时间:2015-08-16 18:46:26

标签: javascript

我有一个返回值的HTTPRequest。我正在使用回调函数捕获这样的值。

如果用户名在数据库中重复,代码将执行并发出警报。但是,“return false”无法正常工作,无论如何都会使用重复的用户名提交表单(saveNewUser)。到目前为止,我看到的所有示例都只是在我的代码中使用警报停止回调。那么如何实现返回false会像其他情况一样停止执行:首先,姓氏和密码检查?

非常感谢你。

function checkUsername(callbackUsername){
    var username = document.getElementById('username_id').value;
    var ajaxRequest = getXMLHttp();

          ajaxRequest.onreadystatechange = function()
          {
            if(ajaxRequest.readyState == 4 && ajaxRequest.status==200){ 
               var response = trim(ajaxRequest.responseText);
               callbackUsername(response);
            } 
          };
        var url = "../admin/check_unique_username.php";    
        var parameters = "username="+username;
        ajaxRequest.open("POST", url, true); 
        ajaxRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");        
        ajaxRequest.send(parameters);   
    }

function checkNewUserForm(){
    if(document.getElementById('first_name_id').value === ""){
        alert("First Name cannot be blank!");
        document.getElementById('first_name_id').focus();
        return false;
    }
    if(document.getElementById('last_name_id').value === ""){
        alert("Last Name cannot be blank!");
        document.getElementById('last_name_id').focus();
        return false;
    }
    checkUsername(function(result) {
        if(result > 0){
        alert("ERROR: Username already exist. Please select a different username!!");
        document.getElementById('username_id').focus();
        return false;
        }
       });
    re = /[0-9]/; 
    if(!re.test(document.getElementById('password_id').value)) { 
       alert("Error: password must contain at least one number (0-9)!"); 
       document.getElementById('password_id').focus(); 
        return false;
    }
    saveNewUser(first_name,last_name,username,password);
} 

1 个答案:

答案 0 :(得分:0)

return false,您只能从callback功能返回。您必须从checkNewUserForm()函数返回以停止保存新用户。为此,您可以使用boolean变量hasDuplicateUsername来检查是否存在重复的用户名条目,以便您可以在回调中将其设置为true。在saveNewUser()之前,您应该检查它是否为false

function checkNewUserForm(){
    var hasDuplicateUsername = false;
    if(document.getElementById('first_name_id').value === ""){
        alert("First Name cannot be blank!");
        document.getElementById('first_name_id').focus();
        return false;
    }
    if(document.getElementById('last_name_id').value === ""){
        alert("Last Name cannot be blank!");
        document.getElementById('last_name_id').focus();
        return false;
    }
    checkUsername(function(result) {
        if(result > 0){
        alert("ERROR: Username already exist. Please select a different username!!");
        document.getElementById('username_id').focus();
        hasDuplicateUsername = true;
        }
    });
    re = /[0-9]/; 
    if(!re.test(document.getElementById('password_id').value)) { 
       alert("Error: password must contain at least one number (0-9)!"); 
       document.getElementById('password_id').focus(); 
        return false;
    }
    if(!hasDuplicateUsername) {
        saveNewUser(first_name,last_name,username,password);
    }
}