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!!")
   }

};

Leave a Reply

Your email address will not be published. Required fields are marked *