如何等待来自observable的第二个值

时间:2018-01-25 17:00:03

标签: angular rxjs

我的情况是有一个认证警卫,所有路线都在它下面。

身份验证服务通过向后端发送请求来确定用户是否已登录

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发出第二个值?

1 个答案:

答案 0 :(得分:4)

我认为这个问题可能来自于Behavioursubject。来自文档:

  

观察者可以订阅主题以接收最后一个(或初始)值以及所有后续通知。

正如您所知,这意味着您在订阅时会立即收到数据,如果设置了默认值。

幸运的是,文档随后提供:

  

如果您要查找的BehaviorSubject没有初始值,请参阅Rx.ReplaySubject

ReplaySubject不像BehaviourSubject那样发送初始值,但它仍然提供了能够“延迟”订阅并仍然收到最新事件的好处。

BehaviorSubjectReplaySubject文档。