鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

Defferdオブジェクトを2重のforループの中で使ってうまく待合せられない

あれが、終わったら、これらをする。 あれが、終わったら、これらをする。 あれが、終わったら、これらをする。 あれら、これらがすべて終わったら それ(alert)をやる。 がやりたい。

var ajaxs = [];

for (var i=0;i<length_i;i++){
    var ajax1 = $.ajax(url, params).done(function (data){    
        for (var j=0;j<length_j;j++){
            var ajax2 = $.ajax(url, params); 
            push(ajaxes,ajax2);
        }
        $.when.apply(undefined, ajaxes).done(function (){
            alert("hoge");
        });
    }
}

上記例だと、iのループがすべておわっていないに、alert文が実行されてしまう。 だからといって、下記の例だと、jのループが終わっていないのに、alert文が 実行されてしまう。さて、どうすればいいのだろうか?

var ajaxs = [];

for (var i=0;i<length_i;i++){
    var ajax1 = $.ajax(url, params).done(function (data){    
        for (var j=0;j<length_j;j++){
            var ajax2 = $.ajax(url, params); 
        }
    }
    push(ajaxes,ajax1);     
}
$.when.apply(undefined, ajaxes).done(function (){
    alert("hoge");
});

とりあえず、搾り出したコードは、こんな感じ。まったく美しくないコードですが・・・

var ajaxs = [];
var count = 0;

for (var i=0;i<length_i;i++){
    var ajax1 = $.ajax(url, params).done(function (data){    
        for (var j=0;j<length_j;j++){
            var ajax2 = $.ajax(url, params); 
            push(ajaxes,ajax2);     
        }
        $.when.apply(undefined, ajaxes).done(function (){
            count = count + 1;
            if (count >= length_i){
                alert("hoge");
            }
        });
    }
}