返回主题仅用于订阅

时间:2019-01-25 20:25:11

标签: javascript typescript rxjs observable subject

我的问题是关于在不允许接收方对主题进行.next()的情况下返回对主题的引用。

例如,我有一个包含主题的服务,可以触发有关该主题的新事件

class ExampleService {
  private exampleSubject = new Subject<boolean>;

  // Ideally the only way to call next on the subject
  doNext() {
    this.exampleSubject.next(true);
  }

  getSubject() {
    // Ideally returning a reference to the subject but only with the 
    // ability to subscribe and listen for events, not to call .next()
    return this.exampleSubject;
  }
}

同样,我正在寻找一种让其他组件调用此服务并获取主题但只能订阅和侦听更改的方法,而他们应该无法进行更改。

ExampleService.getSubject().subscribe(() => {
  //do something 
}) // ok
ExampleService.getSubject().next(true) // error/not allowed

1 个答案:

答案 0 :(得分:3)

官方推荐的方法(假设您使用的是TypeScript)是强制将Subject重新键入为Observable(Subject是Observable,就像其他任何对象一样):

class ExampleService {
  private exampleSubject = new Subject<boolean>();
  observable$: Observable<boolean> = this.exampleSubject;

  ...
}

现在observable$可以公开,因为它只是常规的Observable。 TypeScript不允许您调用ExampleService.observable$.next(),因为该方法在Observable上不存在。

如果仅使用JavaScript,则可以使用exampleSubject.asObservable()从某个主题返回Observable。

关于RxJS的GitHub的讨论也很相关:https://github.com/ReactiveX/rxjs/pull/2408