Observable vs Subject和asObservable

时间:2018-02-22 19:20:41

标签: javascript angular typescript rxjs angular-services

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

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

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

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

2 个答案:

答案 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);
      }