1

やあ、私は ajax-request と setTimeout を含む jQuery each()-loop に取り組んでいます。それは私にプログラムの流れにいくつかの問題を与えています。

xml_queries: function (data) {
    var values = [];

    // ...

    $.each(data, function(index, value) {

        // ...

        // Start xml query
        var i = 0;
        get_data(value.value);

        function get_data(value) {
            $.ajax({
                type: 'POST',
                url: '/admin/scanner/get_music_data/' + value,
                dataTaype: 'json',
                success: function(response) {
                    if ( response === 'FALSE' ) {
                        // Start recursion - up to 3 Retries
                        if ( ++i <= 3 ) {
                            setTimeout(function() {
                                get_data();
                            }, 100);
                        } else {
                            // ...
                        }
                    } else {
                        values.push(response);
                    }
                }
            });
        }
    });
    // return values;
    console.log(values);
}

私の問題は、最後の行の console.log() がすぐに起動されることです (ループがまだデータを処理している間)。ループが終了するのを待つ簡単な可能性はありませんか? \:

よろしくお願いします!

4

1 に答える 1

1

現在のコードに基づいて、最も簡単な方法は、$.ajax のasyncオプションを false に設定して同期リクエストを強制し、JavaScript がそれが完了するのを待ってから後続のステートメントを実行することです (これは行われません)。非同期リクエスト)。

$.ajax(
   {
    type: 'POST',
    async: false,
    ...

これにより、各リクエストの間、ブラウザーがブロックされます (yuck)。それを行う別の方法は、次の ajax 呼び出しが最初の成功コールバック内から呼び出されるようにアプリケーションを再設計することです。

$.ajax(
   {
    type: 'POST',
    ...
    success: function() {
        doAjaxThingie();
    }
于 2010-11-23T00:56:52.567 に答える