如何同时具有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触发以来的旧值。

有什么想法吗? 预先谢谢你!

解决方法

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

订阅一个可观察对象,通常不需要将其值传递给您自己的主题。

在您的情况下,您不需要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>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...