Observable vs Subject和asObservable

12 javascript rxjs typescript angular-services angular

我正在学习RxJs,我正在寻求对我的假设进行确认或更正.

我试图在我可以在我的服务类的不同位置使用的服务中创建一个public read only observable .next().我想知道这是否是正确的方法:

private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable.asObservable();
Run Code Online (Sandbox Code Playgroud)
  • 用户可以订阅 myObservable$
  • 我可以用myObservable.next(...);

它的工作完美,但我有足够的经验知道我可能只是一个不知情的白痴(RxJS很大).这个用例是正确的模式和正确的对象吗?

mar*_*tin 6

你在做什么是对的。但是,还有一种更短的表示法。由于Subject已经是一个Observable(它继承了Observable类),因此可以将类型检查留给TypeScript:

private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable;
Run Code Online (Sandbox Code Playgroud)

您的服务的任何使用者都可以订阅myObservable$但无法调用,myObservable$.next()因为TypeScript不允许您这样做(Observable类没有任何next()方法)。

实际上,这是推荐的方法,RxJS在内部从不使用asObservable。有关更详细的讨论,请参见:

看到一个非常类似的问题:rxjs主题应该在班级中公开吗?

  • 正确的第二行是“ myObservable $ = myObservable.asObservable();”,它根本没有“ next”方法,并且也是“ Observable &lt;T&gt;”类型的 (2认同)