jQuery bValidator问题 - 异步

时间:2012-06-18 14:09:38

标签: jquery

有没有人知道如何在不禁用异步的情况下使这个ajax功能正常工作? Asynx = false冻结一切......

<script type="text/javascript">   
    $(document).ready(function () {
        $('#form5').bValidator();
    });

    function checkUsername(username){

        var ret = false;

        $.ajax({
            type: 'POST',
            url: 'checkuser.php',
            sync: false, // Want to remove this
            data: {'username':username},
            success: function(data){
                if(data == 'ok')
                    ret = true
            }
        });

        return ret;
    }
</script>
<form id="form5" method="post">
    <p> Choose username:
        <input type="text" data-bvalidator="checkUsername,required" data-bvalidator-msg="This username is not valid or already taken.">
    </p>
    <p>
        <input type="submit" value="Submit">
        <input type="reset" value="Reset">
    </p>
</form>

http://karmela.fsb.hr/~bmauser/bvalidator/documentation.html#serversidevalidation

1 个答案:

答案 0 :(得分:-1)

你对ajax的概念缺乏了解。因为一个原因,它被称为“异步” 如果你删除async: false(你应该,否则它不是真正的ajax),那么'checkuser.php'的请求是异步完成的。意味着脚本继续执行,同时,在“后台”中,发出了ajax请求。
当它完成时,则执行“成功”的回调功能(无论何时发生,你都无法确定) 因此,如果您希望只有在请求的ajax成功完成后才会发生某些事情,那么您应该将它放在“成功”函数中。

如果您删除async: false,则执行顺序如下:

  1. 调用函数'checkUsername'
  2. assign'ret = false'
  3. 调用ajax请求(不等待它完成)
  4. 返回'ret'
  5. ajax完成了它的执行并执行'success()'
  6. 指定'ret = true',但此时'ret'不再存在。
  7. 要了解同步和异步之间的区别,请执行以下两个示例:

    示例1:

    $.ajax({
        type: 'POST',
        url: 'checkuser.php',
        async: false,
        data: {'username':username},
        success: function(data){
            alert('1');
        }
    });
    alert('2');
    

    示例2:

    $.ajax({
        type: 'POST',
        url: 'checkuser.php',
        data: {'username':username},
        success: function(data){
            alert('1');
        }
    });
    alert('2');
    

    在“示例1”中,您将收到“1”,然后收到“2”的警告 但在“示例2”中,您将首先使用“2”然后使用“1”进行提醒 这是因为在'示例1'中,脚本在继续之前等待执行ajax请求以完成,但是在'示例2'中,脚本使ajax请求在“后台”中运行,同时继续其余的脚本。

    希望这说清楚。