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 ループを終了します。そのため、最初のエントリにロールがない場合、ループには入りません。コードに 3 つの変更を加えることをお勧めします。

  1. まず、使用しないでくださいnew Array()...[ ]代わりに使用してください。単に毎回入力する文字数が少ないだけでなく、ブラウザーでは配列リテラルの方がパフォーマンスが優れているため、パフォーマンスの違いが目立ちにくい SSJS でもこの習慣を身に付けるとよいでしょう。同様に、これは特定の例には関係ありませんが、決して使用しないでくださいnew Object(); そのまま使用して{ }ください。
  2. while 条件でロールをチェックする代わりに、 と比較acleして、ループnullでロールをチェックします。これにより、ACL での順序に関係なく、指定されたロールを持つすべてのエントリが返されます。
  3. C++ ハンドルのリークを避けるために、次のエントリをチェックする前に各エントリをリサイクルする必要があります。

3 つの変更をまとめると、修正されたコードは次のようになります。

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 に答える