jQuery deffered について
ajaxでスクリプトを書くときに、ajaxで取った値を基に別のリクエストを送って、返り値を一回目のリクエストと合わせて表示、
なんてことをやる必要があった。
最初recursiveだけで組んでみたが、良い機会なのでdefeerdと組み合わせて使ってみる。かなり見通しが良くなった(と思う)
下の例では、jsonで受け取った結果をflagでrecursive_one, recursive_twoに分けて操作している。
また、json内には順不同でflag = true, false が混在するものとし、true のものから順に展開する。
$(function(){ $.ajax({ type:"GET", url:jsonfile, dataType: "json", success:function(data){ GetResults.getContents_first(data).done(function(data) { GetResults.getContents_second(data).done(function() { GetResults.finalFunction(); }); }); }, error :function(XMLHttpRequest,textStatus){ console.log(textStatus); } }); }); var GetResults = { getContents_first: function(data) { var defer = $.Deferred(); var total = data.somearticle.length; var num = 0; var recursive_one = function(){ var html = ""; if ( num < total ){ if(data.somearticle[num].flag){ var html += data.somearticle[num].contents; $("#target").append(html); num++; recursive_one(); }else{ num++; recursive_one(); } }else{ // call second defer.resolve(data); } } recursive_one(); return defer.promise(); }, getContents_second: function(data) { var defer = $.Deferred(); var total = data.length; var num2 = 0; var recursive_two = function(){ var html = ""; if ( num2 < total ){ var html = ""; if(!data.somearticle[num2].flag){ var html += data.somearticle[num2].contents; $("#target").append(html); num2++; recursive_two(); }else{ num2++; recursive_two(); } }else{ // call third defer.resolve(); } } recursive_two(); return defer.promise(); }, finalFunction : function(data){ console.log("finish!!") } };