2017-04-12 191 views
-3

我试图获取价值的Java脚本函数来使用的变量如何从函数中获取值?

var isMember; 

         IsCurrentUserMemberOfGroup("Team Management System Members", function (isCurrentUserInGroup) { 
          if (isCurrentUserInGroup) { 
           //alert("Admin"); 
           isMember = true; 
           return true; 
          } 
          else { 
           isMember = false; 
           //alert("NoAdmin") 
          } 
         }); 

         alert(isMember); 

其它功能被称为

function IsCurrentUserMemberOfGroup(groupName, OnComplete) { 

         var currentContext = new SP.ClientContext.get_current(); 
         var currentWeb = currentContext.get_web(); 

         var currentUser = currentContext.get_web().get_currentUser(); 
         currentContext.load(currentUser); 

         var allGroups = currentWeb.get_siteGroups(); 
         currentContext.load(allGroups); 

         var group = allGroups.getByName(groupName); 
         currentContext.load(group); 

         var groupUsers = group.get_users(); 
         currentContext.load(groupUsers); 

         currentContext.executeQueryAsync(OnSuccess, OnFailure); 

         function OnSuccess(sender, args) { 
          var userInGroup = false; 
          var groupUserEnumerator = groupUsers.getEnumerator(); 
          while (groupUserEnumerator.moveNext()) { 
           var groupUser = groupUserEnumerator.get_current(); 
           if (groupUser.get_id() == currentUser.get_id()) { 
            userInGroup = true; 
            break; 
           } 
          } 
          OnComplete(userInGroup); 
         } 

         function OnFailure(sender, args) { 
          OnComplete(false); 
         } 
        } 

,但是当我执行我得到的值:未定义

谢谢

+1

'IsCurrentUserMemberOfGroup'是异步的,因此'isMember'可能在您发出警报时未被赋值。 – Li357

+1

您的问题中缺少一些部分 –

+0

您必须确保在尝试检查isMember的值之前调用IsCurrentUserMemberOfGroup。 –

回答

2

您必须确保与IsCurrentUserMemberOfGroup相关的功能在您之前被调用试图检查isMember的值。你不能只在函数的代码之后加上alert(),并且期望它会首先运行该函数。

这里有一个工作示例:

var isMember; 
 

 
function checkUser(isCurrentUserInGroup) { 
 
    if (isCurrentUserInGroup) { 
 
    isMember = true; 
 
    } else { 
 
    isMember = false; 
 
    } 
 
} 
 

 
alert(isMember); // undefined because function hasn't bee called yet 
 

 
checkUser();  // invoke the function with no data being passed in 
 

 
alert(isMember); // false because undefined was passed into function 
 

 
checkUser("Something"); // invoke the function with data being passed in 
 

 
alert(isMember); // true because something was passed into function

0

最有可能有一些异步的东西往里走IsCurrentUserMemberOfGroup,你传递的回调将尽快你异步的东西完成推迟。

潜在的IsCurrentUserMemberOfGroup功能看起来是这样的:一旦

function IsCurrentUserMemberOfGroup(someString, callback){ 
    .. 
    //async stuff here 
    myAPI.asyncMethod(callback); 

    //here the parser will go on with the synchronous code and park in the event queue the callback for the async method 
    .. 
} 

为解析器遇到异步函数,回调将在事件队列内停放。异步函数(例如从文件读取,处理网络等)将由一些其他操作系统任务处理,这些任务会在完成时通知JavaScript线程,以便最终调用回调。

问题在这里。 解析器逐行同步执行,因此它必须不断阻止ui,这就是为什么它在异步过程完成之前到达警报函数,并且打印未定义,因为成员仍未分配。