angular - 如何同时拥有 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>
推荐阅读
- python - 使用 pyspark 将 csv 文件转换为 parquet 文件:Py4JJavaError: An error occurred while calling o347.parquet error
- html - 如何以角度从文本区域获取光标坐标?
- html - 春天 - @Deletapping
- mysql - 如何在时间范围和聚合上优化这个 MySQL 报告查询?
- bash - source .bash_profile 在 shell 脚本中不起作用。我能怎么做?
- javascript - 调查 JS 无线电计算
- javascript - 为什么 d3.select 不能与 html 按钮一起使用
- inno-setup - 为什么预处理器在#include 指令中的行为与在 [Files] 部分 Inno Setup 脚本中的行为不同
- c++ - 找不到assimp头文件
- java - Java Jackson 将普通 Json 数组或 Json 对象反序列化为单个 Java 对象 (POJO)