2016-07-19 2 views
0

StackOverflowの素晴らしいリファレンスに基づいて、$.getリクエストが完了した後に$.when()を使用してイベントをトリガーすることがわかっています。AJAX .getコールに変数を割り当てる

しかし、$.getがforループ内にある場合はどうなりますか?

for (i = 0; i < 5; i++) { 
    $.get()... 
} 

$.when().done(function(a){ 
} 

だから、私は配列に各変数を割り当てるだろうと思った:

var d = Array(5); 
for (i = 0; i < 5; i++) { 
    d[0] = $.get()... 
} 

$.when(d).done(function(a){ 
... 
} 

それが動作するようには思えません。提案する代替案はありますか?それとも、私は正しいことを近づけることをやっていますか?

答えて

1

ないひどい明確にあなたが求めているものがありますが、すべての要求を集約したい場合やすべてが完了したら単一のコールバックを実行すると、次のようになります。

一つ以上の $.get要求が失敗したため、発射されていない

var requests = []; 
for(var i = 0;i < 5;i++) { 
    requests.push($.get(...)); 
} 

$.when.apply(null,requests).then(function() { }); 

.then場合はリクエストの配列を持つ$.whenに210

使用applyは、それはです。試してみてください:

$.when 
    .apply(null,requests) 
    .then(
    function() { console.log('success'); }, 
    function() { console.log('at least one failed'); } 
); 
+0

私はこれを試しました。 'requests.push'を実行すると、すべての' $ .get'リクエストが起動します。だから、すべてのリクエストはあなたが '$ .when'に行くときに行われるので、' .then'は決して起動しません。 – Rio

+0

@リオ - それは約束の仕方ではありません。 '.then'は、すべての約束が解決されたときに、すでに解決されているかどうかにかかわらず、いつまでも将来解決されるでしょう。 '.then'が決して発動しない場合は、おそらくそれらのすべてが解決されていない可能性があります(1つ以上が失敗した可能性があります)。また、もちろん、彼らはあなたがそれらを作成するとすぐに彼らの要求を行います - あなたはいつそれらを要求したいですか? – Adam

+0

あなたはそうです。そのうちの1つが失敗しました。失敗から脱出し、それがあっても続ける方法はありますか? – Rio

0

forループ内にdone()を配置できますか?単に

for (i = 0; i < 5; i++) { 
    $.get().when().done(function(a){ 
    ... 
    } 
} 

または多分より:

for (i = 0; i < 5; i++) { 
    $.get(url, function(a){ 
     ... 
    }); 
} 

この例の中では、 '' 各コールバックインスタンス内で一意になります。コメントをもとに

UPDATE:非同期のため

var accumulate; //outside the loop 

for (i = 0; i < 5; i++) { 
    $.get(url, function(a){ 
     accumulate += a; 
    }); 
} 

UPDATEhttp://caolan.github.io/async/docs.html#.parallel

var myTasks = []; 
for (i = 0; i < 5; i++) { 
    myTasks.push(function(callback) 
     { 
     $.get(url, function(a){ 
      callback(null, a); 
     }); 
     } 
} 
async.parallel(myTasks, function(err, resultsArray) 
{ 
    // all done 
    // aggregate the array as you wish. 
}); 
+0

私はすべての応答(すべての関数(a)が各$ .getにある)からデータを集める何かが必要です。 – Rio

+0

例集計の更新された回答を参照してください。 – Aaron

+0

forループの後に 'accumulate'を取得しようとすると、$ .get要求が長時間かかると、' accumulate'は空白になります。 – Rio

関連する問題