"fork" 可观察的最佳方法

Best method to "fork" observable

每次 http auth API return 授权用户时,我都需要设置 currentUser: BehaviorSubject<>()。现在我正在使用 do 将新用户发送到 BehaviorSubject,但完成这样的任务似乎是一种肮脏的方式。

是否有 fork 方法或类似的东西可以更新观察者和 return 原始观察者?

我有什么

public currentUser: BehaviorSubject<any> = new BehaviorSubject<any>(null);

authUser(email: String, password: String) {
  return this.http.post('api.com/auth', {
    email: email,
    password: password
  })
  .do(user => this.currentUser.next(user))
}

我想要的

return this.http.post('api.com/auth', {
  email: email,
  password: password
})
.fork(this.currentUser)

有多种方法可以解决此问题,但我认为您应该使用 subscribe 而不是 do 并且 authUser 不应该 return 任何东西。为什么有两种方式访问​​同一个东西(当前用户)?

//private field and getter are optional but allows you to expose the
//field as an observable and not a subject
private _currentUser: BehaviorSubject<any> = new BehaviorSubject<any>(null);

get currentUser(): Observable<any> {
  return this._currentUser;
}

authUser(email: String, password: String): void {
  this.http.post('api.com/auth', {
    email: email,
    password: password
  })
  .subscribe(user => this._currentUser.next(user))
}

如果您想进行清理(这是一个异步操作,因此您可能想知道它何时完成),您可以这样做:

authUser(email: String, password: String): Observable<void> {
  let requestObs = this.http.post('api.com/auth', {
    email: email,
    password: password
  }).shareReplay();
  requestObs.subscribe(user => this._currentUser.next(user));
  return requestObs.map(user => null);
}

当然,如果您真的想要 return 值,您可以删除最后一个 map 语句。最后,它与您的 do.

并没有太大区别