Observable 与 Subject 和 asObservable
Observable vs Subject and asObservable
我正在学习RxJs,我正在寻求对我的假设的确认或纠正。
我正在尝试使 public 只读 在我可以在服务的各个地方使用 .next()
的服务中可见 class。我想知道这是否是正确的方法:
private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable.asObservable();
- 用户可以订阅
myObservable$
- 我可以用
myObservable.next(...);
它工作得很好,但我有足够的经验知道我可能只是一个不知情的白痴(RxJS 是巨大的)。对于所述用例,这是正确的模式和正确的对象吗?
在项目中我们使用了这种 Observable,这为您提供了对私有 Observable 的适当封装,但您仍然可以使用一些 public 方法调用 next()
。
private sourceName = new Subject<T>();
name = this.sourceProductName.asObservable();
sendName(item: T) {
this.sourceName.next(item);
}
你的做法是正确的。然而,还有一个更短的符号。由于 Subject 已经是一个 Observable(它继承了 Observable class),你可以将类型检查留给 TypeScript:
private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable;
您服务的任何消费者都可以订阅 myObservable$
但无法调用 myObservable$.next()
因为 TypeScript 不允许您这样做(Observable class 不允许有任何 next()
方法)。
这实际上是推荐的做法,RxJS 内部从不使用 asObservable
。更详细的讨论见:
看到一个非常相似的问题:
我正在学习RxJs,我正在寻求对我的假设的确认或纠正。
我正在尝试使 public 只读 在我可以在服务的各个地方使用 .next()
的服务中可见 class。我想知道这是否是正确的方法:
private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable.asObservable();
- 用户可以订阅
myObservable$
- 我可以用
myObservable.next(...);
它工作得很好,但我有足够的经验知道我可能只是一个不知情的白痴(RxJS 是巨大的)。对于所述用例,这是正确的模式和正确的对象吗?
在项目中我们使用了这种 Observable,这为您提供了对私有 Observable 的适当封装,但您仍然可以使用一些 public 方法调用 next()
。
private sourceName = new Subject<T>();
name = this.sourceProductName.asObservable();
sendName(item: T) {
this.sourceName.next(item);
}
你的做法是正确的。然而,还有一个更短的符号。由于 Subject 已经是一个 Observable(它继承了 Observable class),你可以将类型检查留给 TypeScript:
private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable;
您服务的任何消费者都可以订阅 myObservable$
但无法调用 myObservable$.next()
因为 TypeScript 不允许您这样做(Observable class 不允许有任何 next()
方法)。
这实际上是推荐的做法,RxJS 内部从不使用 asObservable
。更详细的讨论见:
看到一个非常相似的问题: