2017-08-10 4 views
0

私のプログラムの構造は次のとおりです。forループでajaxリクエストからデータを取り出す方法は?次のように

var output = []; //<---- where I want to store the data 

function getData(){ 
    for(...){ 
     $.getJSON("...", function(data){ 
      if(...){ 
       output.push(data[...]); 
      }else{ 
       $.getJSON("...", function(data2){ 
        output.push(data2[...]); 
       }); 
      } 
     }); 
    } 
} 

これが原因私はAJAX呼び出しの非同期な性質であることを理解して何に動作しません。関数を呼び出した後、データにアクセスできません。出力[0]を行うと、未定義が返されます。

+0

あなたの完全なコードとあなたのデータがどのように見えるかをリンクできれば。なぜ 'forループ'の内部にネストされていますか?それは一般的には良いことではありません。 –

+0

この場合、ループ内で実際に呼び出しを実行する必要がある場合は、約束事で作業する必要があります。 – Legends

+0

"出力[0]は未定義を返します。"それは 'getJSON'関数が返る前になります。コールバック内のデータにアクセスする必要があります。そうでない場合は、コールバックから約束を返し、データにアクセスする前に解決するまで待つ必要があります。 –

答えて

1

あなたは同期ループで要求を開始できますが、応答が非同期的にをリッスンする必要があります。 jQueryのgetJSONメソッドはPromise互換のjqXHRオブジェクトを返します。したがって、Promise.allを次のように使用することができます:

function getData() { 
    var requests = []; 

    for (...) { 
    const request = $.getJSON(...); 
    requests.push(request); 
    } 

    return Promise.all(requests); 
} 

getData().then(function (results) { 
    // results is an array with responses of your requests (ordered by push order) 
}); 
関連する問題