0

Ajax プログラムが期待どおりに実行されません。コードを見る

$(document).ready(function(){
$("input").keyup(function() {
    for(var i=400;i<421;i++){
        (function(counter){
            counter=String(counter);
            $.ajax({
                type: "GET",
                url: "results/result_html.php?usn="+txt+counter+"&resultType="+resultType,
                dataType:"JSON",
                success:function(result){
                    $("#info").hide();
                    $("#result").html(result);              
                    $("#usn").attr("placeholder", "Class USN");
                }
            });
        })(i);
    }
    alert("hai");
});});

このコードでは、for ループ内にあるすべての Ajax リクエストが完了した後にアラートを表示したいと考えています。しかし、このコードを実行するとアラートが最初に表示されます。私は Ajax を初めて使用します。期待どおりに実行できるように誰か助けてください。

4

3 に答える 3

3

Ajax は非同期です。つまり、コードを並行して実行し続けます。Ajax リクエストが完了すると、success 関数が呼び出されます。あなたができることはこれです:

$(document).ready(function(){
$("input").keyup(function() {
    var loopsToDo = 20, done=0;
    for(var i=400;i<421;i++){
            var counter=String(i);
            $.ajax({
                type: "GET",
                url: "results/result_html.php?usn="+txt+counter+"&resultType="+resultType,
                dataType:"JSON",
                success:function(result){
                    $("#info").hide();
                    $("#result").html(result);              
                    $("#usn").attr("placeholder", "Class USN");
                },
                complete : function(){
                    done++;
                    if( done == loopsToDo)
                    {
                        alert("DONE")
                    }
                }
            });
    }

});});
于 2013-02-27T09:41:36.120 に答える
1

あなたのコードは奇妙です。なぜそれが行くのですか

for(var i=400;i<421;i++)

また、アラートはどの Ajax 呼び出しよりも先に表示されます。これは、ajax が非同期であるため、残りのコードとは別に実行されることを意味します。20 個の Ajax リクエストを実行しているため、アラートは 20 個すべてが完了するまで待機しません。必要なことは、成功部分で Ajax 呼び出しの数を保持し、それが 20 に達したときにアラートを表示することです。

于 2013-02-27T09:42:21.497 に答える
0

AJAX 呼び出しは非同期であるため、AJAX 呼び出しをセットアップしてから、スクリプトの実行を続行します。「success」パラメーターは、応答が受信されたときに使用するコールバックを指定します。応答はいつでも発生する可能性があります (したがって、非同期)。

$(document).ready(function(){
    $("input").keyup(function() {
        for(var i=400;i<421;i++){
            (function(counter){
                counter=String(counter);
                $.ajax({
                    type: "GET",
                    url: "results/result_html.php?usn="+txt+counter+"&resultType="+resultType,
                    dataType:"JSON",
                    success:function(result){
                        $("#info").hide();
                        $("#result").html(result);              
                        $("#usn").attr("placeholder", "Class USN");
                        alert("hai");
                    }
                });
            })(i);
        }
    });
});

それはあなたの問題を解決するはずです。

于 2013-02-27T09:41:31.960 に答える