【发布时间】:2022-06-22 17:58:20
【问题描述】:
我需要创建一个 Observable 来收集来自一些 http 请求的其他 observable。新的 observable 必须是相同对象类型的集合,但每个项目必须是唯一的。你能帮我写出正确的方法来实现这个目标吗?
// The result observable that I need
topicCollection$ = BehaviorSubject<Topic[]> = new BehaviorSubject<Topic[]>(null);
// Boolean observable of authentication
isAuthenticated: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(null);
// Return default topic
get defaultTopics$(): Observable<Topic[]>{
return this.defaultTopic.asObservable();
}
// Return topics selected by Admin
get TopTopics$(): Observable<Topic[]>{
return this.topTopic.asObservable();
}
//Return topics selected by User
get userTopics$: Observable<Topic[]>{
return this.userTopic.asObservable();
}
//Return user settings
get userSettings$(): Observable<any[]>{
return this.userSettings.asObservable();
}
所以约束是:
- 如果用户未登录,集合必须按此顺序:defaultTopic、topTopic
- 如果用户登录,集合必须按以下顺序:defaultTopic、topTopic、userTopic
- 如果用户已登录,我将读取过滤默认主题的 UserSettings$(如果它们将被隐藏或显示)
- 主题必须是唯一的(重复的主题仅在默认情况下且用户主题可观察)
我尝试使用 combineLatest 和 forkJoin,但我不知道如何区分操作员和身份验证观察者。
【问题讨论】:
-
尝试使用forkjoin?
-
一切都是
BehaviourSubject有什么原因吗?默认的null案例有语义吗? Null 不是“相同对象类型的集合” - 所以我不确定在您当前的设置下您想要什么是可能的。如何知道用户是否登录?那是用户设置的一部分吗?userSettings可以是任何东西的列表,任何东西列表上的过滤器应该如何工作?defaultTopic、topTopic和userTopic都是列表,当你说 order 时是什么意思?连接它们?如果您发现重复,您如何在删除它们的同时保留您的订单(删除哪一个)? -
我使用 BehaviourSubject 是因为我想要最后一个值,null 因为我写错了:) 如果 isAuthenticated 发出 true,我知道用户是否已登录。 UserSettings 是 {key: value} 的列表,例如 {topicOfTheDay: 'off'} 所以如果 Topic == 'topicOfTheDay' 的标签是关闭的,我想隐藏它。对于订单,我的意思是连接它们如果我发现重复项,我想删除 userTopic 之一。感谢您的宝贵时间
标签: angular rxjs observable