我遇到的情况是有一个auth防护,并且所有路由都在其下方。
的AUTH服务确定用户是否已登录或不通过发送请求到后端
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))
}
Run Code Online (Sandbox Code Playgroud)
但是,auth Guard似乎并没有等待请求完成,而是将布尔值false作为(isLoggedIn $ observable)的预定义值
授权警卫
constructor (private authService: AuthService, private router: Router) {
this.authService.isLoggedIn$.subscribe(isLoggedIn => this.isLoggedIn = isLoggedIn)
}
Run Code Online (Sandbox Code Playgroud)
有没有办法等到请求完成或至少获得通过可观察对象发出的第二个值?
我相信问题可能出在Behavioursubject这里。从文档:
观察者可以订阅主题以接收最后(或初始)值以及所有后续通知。
如您所见,这意味着如果设置了默认值,则您将在订阅后立即接收数据。
幸运的是,文档随后提供了:
如果您正在寻找
BehaviorSubject没有初始值的产品,请参见Rx.ReplaySubject
ReplaySubject 不会像BehaviourSubject那样发送初始值,尽管它仍然具有能够订阅“延迟”并仍接收最新事件的好处。
BehaviorSubject和ReplaySubject文档。
| 归档时间: |
|
| 查看次数: |
1896 次 |
| 最近记录: |