JSOM Break SharePoint List Item Permission
-
11-01-2021 - |
题
I wrote the following code to break list item permission. Code works fine other than a small issue.
var user;
function breakItemPermission(itemID) {
//Get the current context
var context = new SP.ClientContext();
var oList = context.get_web().get_lists().getByTitle(listName);
this.oListItem = oList.getItemById(itemID);
oListItem.breakRoleInheritance(false);
getCurrentUser();
console.log(user);//undefined always
var oUser = context.get_web().ensureUser(user);
oListItem.get_roleAssignments().getByPrincipal(oUser).deleteObject();
context.load(oUser);
Id = itemID;
context.load(oListItem);
context.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
function onQuerySucceeded(sender, args) {
console.log('Role inheritance broken for item ');
grantPermission(Id);
}
function onQueryFailed(sender, args) {
grantPermission(Id);
console.log('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
function getCurrentUser(){
var context = new SP.ClientContext();
currentUser = context.get_web().get_currentUser();
context.load(currentUser);
context.executeQueryAsync(Function.createDelegate(this,this.onQuerySucceededGetCurrentUser), Function.createDelegate(this,this.onQueryFailedGetCurrentUser));
}
function onQuerySucceededGetCurrentUser() {
user=currentUser.get_email();
}
function onQueryFailedGetCurrentUser(sender, args) {
alert('Request failed. \nError: ' + args.get_message() + '\nStackTrace: ' + args.get_stackTrace());
}
In breakItemPermission() function user variable is always undefined even it's defined as global. Due to that current user permission cannot be broken. Any hack to overcome this problem?
解决方案
This is because your function getCurrentUser()
has an async operation (executeQueryAsync
). JS does not wait for it to complete and executes the next line i.e. console.log(user)
.
You need write the subsequent code from getCurrentUser()
inside the function onQuerySucceededGetCurrentUser
then only you will get the current user.