2016-01-22 2 views
0

Я использовал код от Check if Current Users belongs to SP group using javascript Client Side Object Model, чтобы проверить, является ли пользователь SP в группе SP. Я хотел пропустить несколько групп для пользователя, поэтому я зациклил этот код в цикле. Однако код выполняется только при последнем значении массива циклов. Есть предположения?Функция Javascript не работает внутри цикла, работает только в конце

function addSchools() { 
 
    for (var i = 0; i < schoolArray.length; i++) { 
 
     groupId = schoolArray[i][2] 
 
     optionText = schoolArray[i][0] 
 
     console.log(optionText) 
 
     isUserMemberOfGroup(currentUserId, groupId, 
 
     function(isCurrentUserInGroup) { 
 
      if (isCurrentUserInGroup) 
 
      console.log('yes'); 
 
      else 
 
      console.log('no'); 
 
     }, 
 
     function(sender, args) { 
 
      console.log(args.get_message()); 
 
     });;; 
 
    }

Выход выглядит следующим образом:

schoola 
schoolb 
schoolc 
shooold 
yes 

вместо

schoola 
yes 
schoolb 
no 
schoolc 
yes 

isUserMemberOfGroup:

function isUserMemberOfGroup(userId, groupId, success,error) { 

var ctx = SP.ClientContext.get_current(); 
var allGroups = ctx.get_web().get_siteGroups(); 
var group = allGroups.getById(groupId); 
ctx.load(group,'Users'); 

ctx.executeQueryAsync(
    function(sender, args) { 
     var userInGroup = findUserById(group.get_users(),userId); 
     success(userInGroup); 
    }, 
    error);  

    var findUserById = function(users,id){ 
     var found = false; 
     var e = group.get_users().getEnumerator(); 
     while (e.moveNext()) { 
      var user = e.get_current(); 
      if (user.get_id() == id) { 
       found = true; 
       break; 
      } 
     } 
     return found; 
    }; 

}

ответ

0

только что получил его на работу с помощью:

ctx.executeQueryAsync( 
function(sender, args) { 
    var userInGroup = findUserById(group.get_users(),userId); 
    console.log(optionText) 
    console.log('yes here we go ' + optionText) 
    var option = document.createElement("option"); 
    option.text = optionText 
    x.add(option); 
}, 
error); 

Спасибо всем за ваш вклад!

0

isUserMemberOfGroup() принимает обратный вызов, который записывает «да» или «нет», так что к тому времени, когда обратный вызов вызывается, все итерации цикла закончили и все школы были записаны. Подумайте о том, чтобы перемещать школу во внутреннюю часть обратного вызова, чтобы сохранить синхронность.

EDIT: добавление некоторого кода.

function addSchools() { 
schoolArray.forEach(function (item) { 
    groupId = item[2] 
    optionText = item[0] 
    console.log(optionText) 
    isUserMemberOfGroup(currentUserId, groupId, 
    function(isCurrentUserInGroup) { 
     console.log(optionText); 
     if (isCurrentUserInGroup) 
     console.log('yes'); 
     else 
     console.log('no'); 
    }, 
    function(sender, args) { 
     console.log(args.get_message()); 
    });;; 
} 
} 

С помощью метода array.forEach() вы можете подвернуть каждый экземпляр цикла в изолированный объем, поэтому вам не придется беспокоиться о переменных перезаписываются.

+0

Спасибо! Я знаю, что такое обратный вызов (у меня есть несколько документов, но я все еще смущен). Где обратный вызов в функции 'isUserMemberOfGroup()'? – As3adTintin

+0

Вы передаете его в качестве третьего параметра, это 'function (isCurrentUserInGroup) {...}'. Это в основном функция, и когда 'isUserMemberOfGroup()' закончен, она вызовет эту функцию, передающую логическое значение, указывающее его результат как параметр 'isCurrentUserInGroup', чтобы вы могли его использовать. – Cameron

+0

Короче говоря, обратный вызов - это функция, которую вы передаете как параметр функции async. Когда функция async будет закончена, она вызовет (вызовет) этот обратный вызов с возвращаемым значением. Пока функция async работает, остальная часть вашего кода продолжает работать, что обеспечивает плавный пользовательский интерфейс. – Cameron

0

function addSchools() { 
 
    for (var i = 0; i < schoolArray.length; i++) { 
 
     groupId = schoolArray[i][2] 
 
     optionText = schoolArray[i][0] 
 
     //console.log(optionText) 
 
     isUserMemberOfGroup(currentUserId, groupId, 
 
     function(isCurrentUserInGroup) { 
 
      console.log(optionText) //put it here! 
 
      if (isCurrentUserInGroup) 
 
      console.log('yes'); 
 
      else 
 
      console.log('no'); 
 
     }, 
 
     function(sender, args) { 
 
      console.log(args.get_message()); 
 
     });;; 
 
    }

+0

Спасибо за предложение. В результате получается 'schoolc'' yes', где пользователь даже не находится в 'schoolc'. – As3adTintin

+0

Чтобы сделать это решение, вам нужно использовать array.forEach (или что-то еще, что обертывает реализацию цикла в области выделения) вместо базового цикла, в противном случае переменная optionText будет иметь свое значение, которое изменилось синхронно, прежде чем оно будет асинхронно регистрироваться. – Cameron

Смежные вопросы