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

Return value from a asyncronous request using a callback function

本文关键字:异步 请求 返回值 函数 回调      更新时间:2023-09-26

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

如果用户名在数据库中重复,代码将执行并发出警报。然而,"返回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);
} 

通过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);
    }
}