首页 > 解决方案 > 如何同时拥有 ReplaySubject 和 BehaviorSubject 功能

问题描述

我有以下代码:

class MyClass {
  private readonly clientId$: ReplaySubject<string>;

  public get clientId(): Observable<string> {
    return this.clientId$;
  }

  constructor([... things]) {
    this.clientId$ = new ReplaySubject<string>(1);
    
    someObservable
      .pipe(
        map(arg => {
          // business logic and what not...
        }))
      .subscribe(clientId => {
        this.clientId$.next(clientId);
      });
  }
}

我希望能够myClassInstance.clientId.value();像行为主题一样使用例如。除了clientId获得旧值的新订户之外,因为someObservable很少触发。

有任何想法吗?先感谢您!

标签: angularrxjsbehaviorsubject

解决方案


虽然这不能直接回答您的问题,但我想指出您可能根本不需要主题!

订阅一个可观察对象,只是为了将值发送到您自己的主题中,通常是不必要的。

在您的情况下,您不需要 ReplaySubject,不需要 getter,也不需要在构造函数中订阅。

这应该做的工作:

class MyClass {
    constructor(private someService:SomeService) { }

    clientId$ = this.someService.someObservable.pipe(
        map(val => val.clientId)
    );
}

至于访问最新的值......你可以将它存储在一个局部变量中:

clientId$ = this.someService.someObservable.pipe(
    map(val => val.clientId),
    tap(clientId => this.clientId = clientId)
);

但很多时候这也没有必要。如果您async在模板中使用管道,您已经获得了展开的最新值。

<h3 *ngIf="clientId$ | async as clientId">{{ clientId }}</h3>

推荐阅读