我试图从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);
}
}
但是当我执行时我得到的值是:undefined
谢谢
答案 0 :(得分: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
答案 1 :(得分: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,这就是它在异步内容完成之前到达alert函数的原因,并且打印未定义,因为成员仍未被分配。