私のコードでは、MS Graphからユーザーリストを取得していますが、これはすべてのユーザーをリストしています。私は指定されたグループのメンバーであるユーザーだけを出したい。だから私は、フィルタを設定している:RXJSフィルターが別の観測にあります
private loadUsers() {
console.log(`Loading users...`);
this.graph.get$(`users`)
.map(resp => resp.json().value)
.flatMap(user => user)
.do(user => {
console.log(`Got user: ${user['displayName']}`);
})
.filter(user => {
// we only want users who are members of the TrackerContact group
const userId: string = user['id'];
console.log(`Checking user ${userId}`);
return this.userIsTrackerContact(user); // <<= PROBLEM HERE!
})
.subscribe(_ => {
console.log(`Completed user fetch!`);
});
}
問題は、ユーザーがメンバーである、私は戻ってMS Graphに別のREST呼び出しを行う必要がありますどのようなグループを見つけるためにある:
private userIsTrackerContact(user): Observable<boolean> {
// get the groups this user is a member of
return this.graph.get$(`users/${user['id']}/memberOf`)
.map(resp => resp.json().value)
.do(groups => {
console.log(`${user['displayName']} is a member of ${groups.length} groups:`);
groups.forEach((group, idx) => {
console.log(` [${idx+1}]: ${group['displayName']}`);
})
})
.map(groups => {
const found = groups.find((group) => group['id'] === this.authConfig.azureGroups.trackerContact)
return !isUndefined(found);
})
}
それは、 filterに別の観測に基づいて観測可能であると私には思われません。述語テストは単純な真偽テストでなければなりません。
Observableを別のObservableの結果に基づいてフィルタリングするにはどうすればよいですか?
軽量データを得るには、サービス側でこれをフィルタリングする必要があります。両方とも同時に実行されるか? – Aravind
@Aravindに同意する必要があります。すでにフィルタリングされたユーザーのコレクションをサーバーに問い合わせて、より大きなユーザーのコレクションを取得し、各ユーザーにフィルタリングするためのHTTPリクエストを作成する方が効率的です。 –
@ stely000:私は原則として同意していますが、実際には全く別の手法を使ってこの問題を解決しましたが、問題は残っていると思います。それ以外の方法がない場合はどうすればよいですか? –