1

我在我的组合框值中执行了以下代码,但它是空的,尽管我确实将一些用户放入具有“审阅者”角色的 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。

4

1 回答 1

6

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

  1. 首先,永远不要使用new Array()...[ ]改用。除了每次键入的字符更少之外,在浏览器中,数组字面量的性能更好,因此即使在性能差异不太可能被注意到的 SSJS 中,养成这种习惯也是件好事。同样,虽然这与您的具体示例无关,但切勿使用new Object(); 只需使用{ }.
  2. 而不是检查您的 while 条件中的角色,而是比较aclenull检查循环内的角色。这将确保返回具有指定角色的所有条目,无论它们在 ACL 中的顺序如何。
  3. 为了避免泄漏 C++ 句柄,您需要在检查下一个条目之前回收每个条目。

将三处更改放在一起,修改后的代码如下所示:

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;
于 2013-04-08T04:39:02.210 回答