Javascript 函数不在 运行 内部循环,只在结束时运行

Javascript function not running inside loop, only runs at end

我使用了 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());
        });;;
    }

输出如下:

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

}

isUserMemberOfGroup() 接受记录 'yes' 或 'no' 的回调,因此在回调被调用时,循环的所有迭代都已完成并且所有学校都已完成记录。考虑将学校登录移至回调内部以保持同步性。

编辑:添加一些代码。

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() 方法,您可以将每个循环实例放入一个独立的范围内,这样您就不必担心变量被覆盖。

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

刚开始使用:

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

感谢大家的参与!