2015-08-16 141 views
0

我有一个返回值的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); 
} 
+0

对于一个基本的用例,我只是用'checkUsername'函数包装所有'checkNewUserForm'。然而,这也将是一个适当的地方使用承诺,其中有像https://github.com/kriskowal/q – Harangue

+0

Sheeeet,我写出了一个完整的答案,然后它被标记为重复:)这是我写给你:http://www.vostok.xyz/32038674_answer.txt – Utkanos

+0

我刚刚找到了一个解决方案:将saveNewUser函数调用内部的checkUsername结果<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); 
    } 
} 
+0

你好Tibzon.I试过那个,但是全局变量没有从回调中更新。那是我尝试的第一件事。 –

+0

这很奇怪。其实它应该按预期工作。你有没有在'checkNewUserForm()'方法内定义'hasDuplicateUsername'变量?一个类似的事情[** here **](http://jsfiddle.net/arunatebel/0nct88fh/) – arunatebel

+0

其实我所做的是创建一个全局变量= 0(在checkNewUserForm之外)变量在if语句(= 1)和if中的警报也显示变量正在更新(打印1)。然而,if语句之外的第二个警报打印为0.这就是我所说的,它不会更新全局变量。我认为这是因为变量的异步状态。内部变量在其他外部变量被更新之前,甚至认为if语句之外的警报最后被调用,所存储的值仍然是0。这就是我迷失的地方。 –