我的情况是有一个认证警卫,所有路线都在它下面。
身份验证服务通过向后端发送请求来确定用户是否已登录
private subject = new BehaviorSubject<User>(undefined)
user$: Observable<User> = this.subject.asObservable().filter(user => !!user)
isLoggedIn$: Observable<boolean> = this.user$.map(user => !!user.id)
constructor (private http: HttpClient) {
http.get<User>(API['AUTH']['GET_AUTHENTICATED_USER'])
.do(console.log)
.subscribe(user => this.subject.next(user ? user : ANONYMOUS_USER))
}
然而,auth guard似乎不等待请求完成并获得布尔值false作为(isLoggedIn $ observable)的预定义值
版权保护
constructor (private authService: AuthService, private router: Router) {
this.authService.isLoggedIn$.subscribe(isLoggedIn => this.isLoggedIn = isLoggedIn)
}
有没有办法等到请求完成或至少通过observable发出第二个值?
答案 0 :(得分:4)
我认为这个问题可能来自于Behavioursubject
。来自文档:
观察者可以订阅主题以接收最后一个(或初始)值以及所有后续通知。
正如您所知,这意味着您在订阅时会立即收到数据,如果设置了默认值。
幸运的是,文档随后提供:
如果您要查找的
BehaviorSubject
没有初始值,请参阅Rx.ReplaySubject
ReplaySubject
不像BehaviourSubject那样发送初始值,但它仍然提供了能够“延迟”订阅并仍然收到最新事件的好处。