2016-03-28 9 views
0

ネストされたcontext.executeQueryAsyncをDeferredで使用するにはどうすればよいですか?以下は私のコードであると私は私が探しています正確に何を説明します:ネストされたcontext.executeQueryAsync with Deferred

コード

function getValues() { 
    var dfd = $.Deferred(function() { 

     context.executeQueryAsync(function() { 
      var navigationItem = []; 

      // First Loop 
      while (termEnumerator.moveNext()) { 

       // Push Parent Terms in navigationItem array 
       navigationItem.push({ "name": ""}); 

       // Get Sub Terms 
       context.executeQueryAsync(function() { 
        // Second Loop 
        while (termsEnum.moveNext()) { 
         // Push Sub Terms in navigationItem array 
         navigationItem.push({ "name": ""}); 
        } 
       }, function (sender, args) { 
        console.log(args.get_message()); 
       }); 
      } 

      dfd.resolve(navigationItem); 

     }, function (sender, args) { 
      console.log(args.get_message()); 
      dfd.reject(args.get_message()); 
     }); 
    }); 
    return dfd.promise(); 
} 

基本的に私は、コードの構造上使用してSharePoint Onlineの中で(それはサブ用語だ&規約)分類を取得しようとしています。最初はnavigationItemという名前の配列を作成し、すべての用語を繰り返しました。

最初に、この配列に用語をプッシュしています。これに加えて、サブ用語があれば、同じ配列にプッシュします。

2番目のループが実行を完了するまで、そのコードがさらに実行されないようにします。私は最終的な配列を持って、別の関数に戻します。

答えて

1

2番目のループが完了するまで、コードが実行されないようにします。 実行中です。私は最後の配列を持っているので、別の関数 にそれを返します。

この場合、executeQueryAsyncごとに遅延が必要です。

次に、すべての非同期メソッドが完了するのを待つために全体的な遅延を作成する必要があります。ここで

はあなたの参照のためのサンプルコードです:

(function ($) { 
    function executeQueryAsync(succeededCallback, failedCallback) 
    { 
     var period = Math.random() * 10000; 

     setTimeout(function() { 
      succeededCallback(); 
     }, period); 

    } 

    function forEachAsync(items, funcAsync, callback) 
    { 
     var count = 0; 

     var total = $.Deferred(); 

     function increment() 
     { 
      count++; 

      if(count == items.length) 
      { 
       total.resolve(); 
      } 
     } 

     for (var i = 0; i < items.length; i++) 
     { 
      (function exec(item) { 
       var deferred = $.Deferred(function (defer) { 
        funcAsync(function() { 
         callback(); 
         defer.resolve(); 
        }); 
       }); 

       deferred.done(function() { 
        increment(); 
       }); 
      })(items[i]); 
     } 

     return total.promise(); 
    } 

    var promise = forEachAsync([1, 2, 3, 4, 5], executeQueryAsync, function() { 
     console.log('call back executing + ' + Date.now()); 
    }); 

    promise.done(function() { 
     console.log("promise done"); 
    }); 
})(jQuery); 

enter image description here