2017-03-12 7 views
0

を使用している間、各入力の値のためのgetJSON呼び出しを実行し、私は特定のクラス名を持つ任意の入力をチェックする作業機能を持っている)(.eachの秩序を維持:jQueryの - .getJSON

function getTopFeeds() { 
    if (jQuery('input.class-name').length > 0) { 
    jQuery.each(jQuery('input.class-name'),function(){ 
     var feedName = jQuery(this).val(); 
     jQuery.getJSON("https://api.url/"+feedName).success(function(data) { 
     if (!(data)) { 
      return; 
     } 
     var result = data.results[0]; 
     if (result) { 
      // Here I create HTML list items to display API data 
     } 
     }); 
    }); 
    } 
} 

それは、動作しますが、非同期であるため、ページの入力順に返されません。データが入力と同じ順序で表示されるように、既存の関数を変更するにはどうすればよいですか?

+1

'.each()'を呼び出すごとにインデックスが付けられます。 1つの可能性は、作成するリクエストの数と同じ長さの配列を作成し、応答が返ってくるたびに、レスポンスをその繰り返しのインデックスのArrayに配置することです。 –

+0

...それから、完了したらすべてを処理するか、「0」で始まる別のカウンタを維持して、新しい項目が配列に追加されるたびに、ヒットするまでカウンタの現在の位置から反復してみてください配列の 'undefined'値です。これにより、すべてのページが完了するまで待つことなく、ページの順序付けられた更新を提供できます。 –

答えて

0

すべてが戻ってくるまで待つことを望むなら、結果を配列に保持し、見た結果の数を覚えておくことができます。あなたが要求と同じくらい多くの結果を見たとき、あなたは完了です。コメントを見る:

function getTopFeeds() { 
    if (jQuery('input.class-name').length > 0) { 
     // Get the inputs 
     var inputs = jQuery('input.class-name'); 
     // Storage for the results 
     var results = []; 
     // Counter for # of responses we've seen 
     var counter = 0; 
     // Get them 
     inputs.each(function(index) { 
      var feedName = this.value; 
      jQuery.getJSON("https://api.url/" + feedName) 
       .done(function(data) { 
        // Got a response, save it or null if falsy (would that really happen?) 
        results[index] = data ? data.results[0] : null; 
       }) 
       .fail(function() { 
        // Error response, use null as a flag 
        results[index] = null; 
       }) 
       .always(function() { 
        // Called after `done` and `fail` -- see if we're done 
        if (++counter === inputs.length) { 
         // Yes, we're done -- use the results in `results` 
         // Note that there will be `null`s for any that 
         // didn't have data 
        } 
       }); 
     }); 
    } 
} 
+0

ご協力いただきありがとうございます!有益なコメントを感謝します。 .always()関数でforループをインクルードして各フィードのHTML要素を出力することで、これを完全に統合して入力の順序を出力できました。 – jrmyp