мой вопрос касается возврата ссылки на тему, не позволяя получателю делать .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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Официально рекомендуемый способ сделать это (при условии, что вы используете TypeScript) - принудительно перепечатать Subject в Observable (Subject является Observable, как и любой другой):
class ExampleService {
private exampleSubject = new Subject<boolean>();
observable$: Observable<boolean> = this.exampleSubject;
...
}
Теперь observable$ может быть общедоступным, потому что это обычный Observable. TypeScript не позволит вам вызвать, например, ExampleService.observable$.next(), потому что этот метод не существует в Observables.
Если вы используете только JavaScript, вы можете использовать exampleSubject.asObservable() для возврата Observable из субъекта.
Это обсуждение на GitHub RxJS также актуально: https://github.com/ReactiveX/rxjs/pull/2408
Спасибо! Это то, что я ищу. .asObservable() в сочетании с типом Observable идеально подходит!