0

有谁知道在不禁用异步的情况下使这个 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

4

1 回答 1

-1

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

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

  1. 调用函数'checkUsername'
  2. 分配'ret = false'
  3. 调用 ajax 请求(不等待它完成)
  4. 返回'ret'
  5. ajax 完成了它的执行并执行 'success()'
  6. 分配'ret = true',但此时'ret'不再存在。

要了解同步和异步之间的区别,请执行以下两个示例:

示例 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 请求在“后台”中运行,同时继续执行其余部分剧本。

希望这可以说清楚。

于 2012-06-18T14:19:02.400 回答