2016-03-28 65 views
0

如何使用嵌套的带有延迟的context.executeQueryAsync?下面是我的代码,我会解释正是我要找:使用上面的代码结构在SharePoint Online中与延迟嵌套的context.executeQueryAsync

代码

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(); 
} 

基本上我想获取分类(条款&它的子项) 。最初,我创建了一个名为navigationItem的数组,并遍历所有术语。

在迭代过程中,首先,我将条件推入该数组中,并且随着这一点,我还得到它的子条款(如果有的话)并将其推入同一个数组中。

我希望代码不会进一步执行,直到第二个循环完成它的执行。这样,我将有最后的数组,而将它返回到另一个函数。

回答

1

我想代码不会进一步执行,直到第二个循环完成 它的执行。这样我将有最后的数组,同时返回 另一个函数。

在这种情况下,您需要对每个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