Javascript函数没有在循环内运行,只在结束时运行

时间:2016-01-22 21:11:38

标签: javascript sharepoint-2010

我使用Check if Current Users belongs to SP group using javascript Client Side Object Model中的一些代码来检查SP用户是否在SP组中。我想为一个用户循环遍历一些组,所以我把这段代码放在一个循环中。但是,代码仅在循环数组的最后一个值上执行。有什么想法吗?



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

输出如下:

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

}

3 个答案:

答案 0 :(得分:0)

isUserMemberOfGroup()采用记录“是”或“否”的回调,因此,当回调被调用时,循环的所有迭代都已完成,所有学校都已记录。考虑将学校日志记录到回调内部以保持同步性。

编辑:添加一些代码。

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()方法,您可以将每个循环实例塞入隔离范围,这样您就不必担心变量会被覆盖。

答案 1 :(得分:0)

DELETE dup FROM allCity AS original 
LEFT JOIN allCity AS dup 
ON dup.city = original.city AND 
dup.objId != original.objId;

答案 2 :(得分: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 ); 

感谢大家的意见!