This question already has answers here:
How do I return the response from an asynchronous call?
                            
                                (38个答案)
                            
                    
                7年前关闭。
        

    

我有一个表单验证功能,该功能验证并检查用户名是否被使用(ajax)。

这就是我所说的代码:

 function validate(){
   if(usernameValid()){
      return true;
   }
   else {
      return false;
   }

 }


我还提醒该函数以查看其返回的内容:

  alert(usernameValid());


问题是警报框在某些情况下会发出“未定义”警报,因此我的验证不会跳转到下一个字段,它会挂起。
更具体地说,它会在所有情况下都警告“未定义”,除非“ length === 0”,然后警告false,这是正确的。

这是usernameValid函数:

    function usernameValid(fld) {
     if( $('#username').val().length !== 0 ) {
      $.post("username_check.php", {
        username: $('#username').val()
      }, function(response){
            response = escape(response);

            if(response==1){
             $('#username_error_invalid').show();
             $('#username_error_empty').hide();
             $('#username_error_taken').hide();
             return false;
            }
            else if(response==2){
                 $('#username_error_taken').show();
                  $('#username_error_invalid').hide();
                 $('#username_error_empty').hide();
                 return false;
            }
            else {
                 $('#username_error_taken').hide();
                  $('#username_error_invalid').hide();
                 $('#username_error_empty').hide();
                 return true;
            }
      });
     }
     else{
         $('#username_error_empty').show();
         $('#username_error_invalid').hide();
         $('#username_error_taken').hide();
         return false;
     }
}


谁知道错在哪里,即为什么在我测试“响应”变量的情况下代码返回未定义的?

顺便说一句:用户名的验证本身可以正常工作(应显示错误等),但返回未定义...

谢谢

最佳答案

这是一个异步调用:

$.post("username_check.php", {....


因此,回调中的return语句会在usernameValid返回之后很长时间发生(并且由于它在运行时未返回任何内容,因此它是undefined)。

如果您有return false;,则应该调用另一个函数,例如:userNameInvalidFunction(),以及true的其他函数……或者只是继续提交,等等。

另一种方法是使您的AJAX调用同步...但是我强烈建议您不要这样做,因为它会在执行时完全锁定用户的浏览器。

09-10 07:46
查看更多