2017-01-03 5 views
0

結果があれば配列をループしたいので、この結果をjavascript配列にプッシュして、各ループとajax呼び出しから取り出します。どうですか?jQueryの各ループとjQueryのajax呼び出しの配列へのプッシュ

私はこれを好きにしようとした:

var ides = ["2254365", "2255017", "2254288", "2220745", "2254452", "2255239", "2232426", "2255143", "2248513", "2254295", "2233629", "2238651", "2254901", "2238430", "2239471", "2255294", "2217888", "2242302", "2242310", "2220380", "56121236", "2255244", "2235716", "2246897"]; 
 
var iArray = []; 
 
$.each(ides, function(index, woide) { 
 
    $.ajax({ 
 
     url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20=%20" + woide + "&format=json", 
 
     dataType: 'json', 
 
     success: function(data) { 
 
      if (data.query.results != null) { 
 
       iArray.push(woide+': '+data.query.results.channel.item.condition.code); 
 
      } 
 
     } 
 
    }) 
 
}) 
 
console.log(iArray); //this don't work
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+2

これは、各ループの終了直後に実行されるためです。それは、ajaxコールの完了を待つことはありません。 – Jai

+0

AJAXは非同期呼び出しであるため、成功/エラーコールバック以外でコードを実行すると、まだ終了していない可能性があります。 –

答えて

1

それはあなたの選択の配列を埋めるためにいくつかの時間がかかるだろうので、あなたのAjaxの呼び出しは非同期です。しかし、Ajaxが完了して各ループが反復処理を終了する前に、ログ呼び出しが発生します。

この時点で、Ajaxはまだ処理中です。

あなたはAJAXの成功ハンドラ内logを移動する必要があります。

var ides = ["2254365", "2255017", "2254288", "2220745", "2254452", "2255239", "2232426", "2255143", "2248513", "2254295", "2233629", "2238651", "2254901", "2238430", "2239471", "2255294", "2217888", "2242302", "2242310", "2220380", "56121236", "2255244", "2235716", "2246897"]; 
 
var iArray = []; 
 
$.each(ides, function(index, woide) { 
 
    $.ajax({ 
 
    url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20=%20" + woide + "&format=json", 
 
    dataType: 'json', 
 
    success: function(data) { 
 
     if (data.query.results != null) { 
 
     iArray.push(woide + ': ' + data.query.results.channel.item.condition.code); 
 
     } 
 

 
     if (index === ides.length - 1) { 
 
     console.log(JSON.stringify(iArray, 0, 0)); // <-----move it here. 
 
     } 
 
    } 
 
    }) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

OPはすべての値がプッシュされた後に1回だけ印刷したいことがあります。プッシュが完了してから印刷されるかどうかをフラグで確認してください。 :) –

+0

毎回ループごとに繰り返しています。 @私のhdi:要件を詳述してください。 – Krunal

+1

@GuruprasadRaoが正しいかもしれません。このOPのためにindexが 'index === ides.length-1'かどうかを見るためにindexを使うことができます。 – Jai

0

をAjax呼び出しによって返された約束を保管してくださいその後、あなたは別のループに

を呼び出します

var ides = ["2254365", "2255017", "2254288", "2220745", "2254452", "2255239", "2232426", "2255143", "2248513", "2254295", "2233629", "2238651", "2254901", "2238430", "2239471", "2255294", "2217888", "2242302", "2242310", "2220380", "56121236", "2255244", "2235716", "2246897"]; 
 
var pArray = []; 
 
var iArray = []; 
 
$.each(ides, function(index, woide) { 
 
    var promis = $.ajax({ 
 
     url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20=%20" + woide + "&format=json", 
 
     dataType: 'json', 
 
    }); 
 
\t 
 
\t pArray.push(promis); 
 
}) 
 

 
$.each(pArray, function(index,prom){ 
 
\t 
 
\t prom.done(function(data){ 
 
\t \t if (data.query.results != null) { 
 
       iArray.push(data.query.results.channel.item.condition.code); 
 
     } 
 
\t }); 
 

 
});

+0

2つの異なるループ以上の利点。 – Jai

関連する問題