2010-11-23 20 views
1

Hey there、 私は、ajax-requestとaTimeを含むjQuery each() - ループを作成しています。それは私にプログラムの流れにいくつかの問題を与えています。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()がすぐに解雇されていることです。ループが終了するのを待つ簡単な方法はありませんか? \:

よろしくお願いいたします。

+0

それは通常のAjax-である非同期問題だを再設計することであろう。これについては、1つのフレーバーや別のもので、**トン**の質問があります。 –

答えて

1

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

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

これは、リクエスト(yuck)ごとにブラウザをブロックします。それを行うための別の方法は次のAJAX呼び出しが最初の成功コールバック内から呼び出されるように、アプリケーション、例えば:

$.ajax(
    { 
    type: 'POST', 
    ... 
    success: function() { 
     doAjaxThingie(); 
    } 
+1

さらに、非同期の動作を説明することになりますが、私はこれらの質問の中でもうんざりしています。 –

+0

ありがとう、それは非常に簡単でした。解決策を探している私の試みで、setTimeoutがその問題を引き起こすことを読んだ。 Btw:同期処理は複数のスレッドで処理されていますか? –

+0

@Matt - 十分に公正。私はこれに少なくとも6〜7回答えました。何度も繰り返されている理由の一つは、そのような質問のフレーズが非常に矛盾していること、グーグルで見つけるのが難しいように思えるからです。おそらく私たちは追加のタグ「非同期」を得るためにSOの方針を設定する必要があります:) – karim79

関連する問題