我正在学习RxJs,我正在寻求对我的假设进行确认或更正。
我正在尝试在服务中创建 public read only observable,我可以在服务类的不同位置使用.next()
。我想知道这是否是正确的方法:
private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable.asObservable();
myObservable$
myObservable.next(...);
它完美无缺,但我有足够的经验知道我可能只是一个不知情的白痴(RxJS很大)。这个用例是正确的模式和正确的对象吗?
答案 0 :(得分:5)
你所做的是正确的。然而,仍然有一些较短的符号。由于Subject已经是一个Observable(它继承了Observable类),你可以将类型检查留给TypeScript:
private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable;
您的服务的任何消费者都可以订阅myObservable$
,但无法调用myObservable$.next()
,因为TypeScript不允许您这样做(Observable类没有任何next()
方法)。
这实际上是推荐的做法,RxJS内部从不使用asObservable
。有关更详细的讨论,请参阅:
查看一个非常相似的问题:Should rxjs subjects be public in the class?
答案 1 :(得分:2)
在项目中我们正在使用这种Observable,这可以为你的私有observable提供适当的封装,但你仍然可以使用一些公共方法调用next()
。
private sourceName = new Subject<T>();
name = this.sourceProductName.asObservable();
sendName(item: T) {
this.sourceName.next(item);
}