XPages SSJS将所有用户置于一个角色下并放入combobox?

XPages SSJS将所有用户置于一个角色下并放入combobox?,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我在combobox值中执行了以下代码,但它是空的,尽管我确实将一些用户放入了角色为“Reviewer”的ACL中: var arr=new Array(); var acl:NotesACL=database.getACL(); var acle:NotesACLEntry=acl.getFirstEntry(); while(acle.getRoles().contains('[Reviewer]')){ arr.push(acle.getName()); acle=acl.

我在combobox值中执行了以下代码,但它是空的,尽管我确实将一些用户放入了角色为“Reviewer”的ACL中:

var arr=new Array();
var acl:NotesACL=database.getACL();
var acle:NotesACLEntry=acl.getFirstEntry();
while(acle.getRoles().contains('[Reviewer]')){
    arr.push(acle.getName());
    acle=acl.getNextEntry(acle);
}
return arr; 

我的数据库在服务器上。我使用的是8.5.3 FP3 UP1。

您列出的代码将在遇到未启用指定角色的条目时退出while循环。因此,如果第一个条目没有角色,它将永远不会进入循环。我建议对代码进行三项更改:

  • 首先,切勿使用
    new Array()
    。。。改用
    []
    。在浏览器中,除了每次输入的字符更少之外,即使在性能差异不太明显的SSJS中,也要养成这种习惯。类似地,虽然这不适用于您的特定示例,但千万不要使用
    newobject()
    ;只要使用
    {}
  • 不要在while条件下检查角色,而是将
    acle
    null
    进行比较,然后检查循环中的角色。这将确保返回具有指定角色的所有条目,而不管它们在ACL中的顺序如何
  • 为了实现此目的,您需要在检查下一个条目之前回收每个条目
  • 将这三个更改放在一起,修改后的代码如下所示:

    var arr = [ ];
    var acl:NotesACL=database.getACL();
    var acle:NotesACLEntry=acl.getFirstEntry();
    var nextEntry:NotesACLEntry = null;
    while(acle != null){
        if (acle.getRoles().contains('[Reviewer]')) {
            arr.push(acle.getName());
        }
        nextEntry = acl.getNextEntry(acle);
        acle.recycle();
        acle = nextEntry;
    }
    return arr;
    

    您列出的代码将在遇到未启用指定角色的条目时立即退出while循环。因此,如果第一个条目没有角色,它将永远不会进入循环。我建议对代码进行三项更改:

  • 首先,切勿使用
    new Array()
    。。。改用
    []
    。在浏览器中,除了每次输入的字符更少之外,即使在性能差异不太明显的SSJS中,也要养成这种习惯。类似地,虽然这不适用于您的特定示例,但千万不要使用
    newobject()
    ;只要使用
    {}
  • 不要在while条件下检查角色,而是将
    acle
    null
    进行比较,然后检查循环中的角色。这将确保返回具有指定角色的所有条目,而不管它们在ACL中的顺序如何
  • 为了实现此目的,您需要在检查下一个条目之前回收每个条目
  • 将这三个更改放在一起,修改后的代码如下所示:

    var arr = [ ];
    var acl:NotesACL=database.getACL();
    var acle:NotesACLEntry=acl.getFirstEntry();
    var nextEntry:NotesACLEntry = null;
    while(acle != null){
        if (acle.getRoles().contains('[Reviewer]')) {
            arr.push(acle.getName());
        }
        nextEntry = acl.getNextEntry(acle);
        acle.recycle();
        acle = nextEntry;
    }
    return arr;
    

    我个人还没有对此进行基准测试,但如果两者之间有任何差异,我会感到惊讶。所有SSJ在运行时都会变成Java,因此任何一种语法都会导致com.ibm.jscript.std.ArrayObject的实例。一旦创建了该实例,任何针对它的操作(理论上)都应该执行相同的操作,而不管它是如何创建的。如果有任何区别的话,很可能是在初始解析中:当整个值/方法绑定解析为AST时,SSJS就变成了Java。在这一步中,数组文字可能需要更少的处理。我个人还没有对此进行基准测试,但如果两者之间有任何差异,我会感到惊讶。所有SSJ在运行时都会变成Java,因此任何一种语法都会导致com.ibm.jscript.std.ArrayObject的实例。一旦创建了该实例,任何针对它的操作(理论上)都应该执行相同的操作,而不管它是如何创建的。如果有任何区别的话,很可能是在初始解析中:当整个值/方法绑定解析为AST时,SSJS就变成了Java。在此步骤中,数组文字可能需要稍微少一些处理。