2015-09-24 2 views
-1

Есть ли возможность сделать некоторую задержку? Я вызываю функцию в цикле while. Эта функция вызывает executeQueryAsync, которая должна завершиться до того, как цикл продолжится. Когда я использую предупреждение, мой код работает, но без него нет.Функция JavaScript, которая ожидает выполнения executeQueryAsync?

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 [здесь] (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) записываете функцию обратного вызова inline и b) вы ставите цикл в обратный вызов успеха.

(Что отличает нас от написания функции обратного вызова «успех» в строке, это функция обратного вызова успеха, которая имеет доступ ко всем переменным в методе. Это закрытие).