4

以下のコードを.each関数で実行しています。ただし、すべてが設定されて完了し、他の変数を実行または警告すると、変数を宣言したときに設定したものがalert(inserted);出てきます。0それらは範囲内にあると確信しています。各呼び出しの後にアラートを出すと、カウンターシステムが機能するため、これは ajax のタイミングに関係しているように感じます。何か考えはありますか?また、アラートを添付すると適切な if ステートメントが呼び出され (上記のように、これを行うとカウンターが機能します)、適切に起動し、コンソールからエラー コードが表示されないことを確信しています。

$.ajax({
    type: "POST",
    url: "/php/filename.php",
    data: {
        one: $('#1').val(),
        two: $('#2').val(),
        three: $('#3').val(),
        four: $('#4').val(),
        five: $('#5').val(),
        six: $('#6').val(),
        seven: $('#classlist').val(),
        id: $('#7').html()
    }
}).done(function(msg) {
    if (msg == "inserted") {
        inserted++;
    }
    else if (msg == "updated") {
        updated++;
    }
    else if (msg == "duplicate") {
        duplicate++;
    }
    else if (msg == "0") {
        fail++;
    }
});
4

1 に答える 1

4

Ajax は非同期です。Ajax が完了する前にアラートが発生しています。すべての ajax 戻り値を配列に格納し、それらをすべて .when に渡し、それを使用して変数の値を警告します。

var promiseArr = [], inserted = 0;

for (var i = 0; i < 30000; i++) { // <--- unrealistic number of iterations
    promiseArr.push($.ajax({url:"foo.php?id=" + i}).done(function(){
        inserted++;
    }));
}
$.when.apply($,promiseArr).done(function(){
    alert(inserted);
});
于 2012-10-18T18:53:33.207 に答える