2015-09-24 82 views
-1

有沒有可能延遲一段時間?我在while循環中調用一個函數。這個函數調用executeQueryAsync,它必須在循環繼續之前完成。當我使用警報時,我的代碼可以正常工作,但如果沒有,則不會。等待executeQueryAsync準備好的JavaScript函數?

while (listPermsEnumerator.moveNext()) { 
     enumG = groups.getEnumerator(); 
     var rAssignment = listPermsEnumerator.get_current(); 
     var member = rAssignment.get_member(); 
     var groupCounter = 1; 
     var name = ''; 

     //alert(''); This alert makes code work 

     while (enumG.moveNext()) { 
      var group = enumG.get_current(); 
      var groupname = group.get_title(); 
      //alert(groupname); 
      if (member.get_title() === groupname) { 
       name = groupname; 
       SP.SOD.executeOrDelayUntilScriptLoaded(function(){ 
        retrieveAllUsersInGroup(groupname, groupCounter, groups); 
       }, key); 
      } 
      groupCounter++; 
     } 

     roleAssignment = this.listRoleAssignments.getByPrincipalId(member.get_id()); 
     roleBindings = roleAssignment.get_roleDefinitionBindings(); 
     // in checkPermission() another executeQqueryAsync is called 
     checkPermission(context, roleAssignment, roleBindings, name); 
    } 

    ... 
    function checkPermission(context, roleAssignment, roleBindings, name) { 
     this.name = name; 
     context.load(roleAssignment); 
     context.load(roleBindings); 
     context.executeQueryAsync(Function.createDelegate(this, Bind), Function.createDelegate(this, BindFail)); 
    } 
+0

請向我們展示您的代碼,我們無法幫助您。 – Zim84

+0

使用jquery promises/diferred發現解決方案[here](http://blog.qumsieh.ca/2013/10/31/using-jquery-promises-deferreds-with-sharepoint-2013-jsom/) – sairfan

回答

0

如果通過異步作業的陣列需要循環,你可以做這樣的事情:

var reports = [11, 12, 14, 15]; 
function doTheReport() { 
    if (reports.length === 0) { 
     alert('All reports are done now.'); 
     return; 
    } 

    var report_Id = reports.pop(); 
    $.ajax({ 
     url: "/DoTheReport", 
     complete: function() { 
      doTheReport(); 
     } 
    }); 
}; 
+0

我檢索SharePoint組並且需要請求每個組的用戶。這種請求只適用於我需要爲循環中的每個用戶調用的「executeQueryAsync」函數。 – FrozeTee

1

最簡單的解決辦法是在反映爲目的的方式來編寫你的方法異步操作。您似乎試圖解決ExecuteQueryAsync並試圖「同步」它。

下面是一個類似的例子 - 請參閱第二個答案:(https://sharepoint.stackexchange.com/questions/95907/executequeryasync-in-for-loop)基本上你a)內聯編寫回調函數,和b)將循環放入成功回調函數中。

(成功回調函數寫入順序的好處是成功回調函數,然後訪問方法中的所有變量,這是一個閉包)。