Observable 与 Subject 和 asObservable

Observable vs Subject and asObservable

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

我正在尝试使 public 只读 在我可以在服务的各个地方使用 .next() 的服务中可见 class。我想知道这是否是正确的方法:

private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable.asObservable();

它工作得很好,但我有足够的经验知道我可能只是一个不知情的白痴(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。更详细的讨论见:

看到一个非常相似的问题: