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 リクエストが行われます。
完了すると、'success' のコールバック関数が実行されます (いつ発生するかはわかりません)。
したがって、要求された ajax が正常に終了した後にのみ何かを実行したい場合は、それを「success」関数に入れる必要があります。

を削除した場合async: falseの実行順序は次のとおりです。

  1. 関数「checkUsername」の呼び出し
  2. 「ret=false」を割り当てます
  3. ajaxリクエストを呼び出します(終了するのを待ちません)
  4. 「ret」を返す
  5. ajax は実行を終了し、「success()」を実行します
  6. 'ret=true' を割り当てますが、この時点で 'ret' は存在しません。

同期と非同期の違いを理解するには、次の 2 つの例を実行します。

例 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 に答える