Как создать Observable из Subject, не подвергая Subject потребителям в RxJs v5

Я пытаюсь вернуть наблюдаемое из функции, которая использует Rx.Subject для внутреннего использования. Конечно, как и в любом хорошем API, детали реализации должны быть полностью абстрагированы от потребителя. Однако при использовании Subject.asObservable() любой потребитель может выдавать новые значения всем наблюдателям.

Пример:

const subject = new Rx.Subject();
const observable = subject.asObservable();

observable.source === subject; // true

observable.forEach(value => console.log(value));
observable.source.next('Hello'); 
// Causes the forEach above to print "Hello"

Поэтому мой вопрос заключается в том, существует ли встроенный способ предоставления Observable потребителям без предоставления им доступа к исходной теме? Если нет, то это явно плохой дизайн со стороны RxJs.

ПРИМЕЧАНИЕ: это для RxJS v5

1 ответ

Решение

Единственный известный мне способ для истинной инкапсуляции этого состоит в том, чтобы подписаться на субъект внутри вашей функции и получить другой (либо субъект, либо пользовательский obervable) возвращаемый, который испускает эти значения.

Но любой оператор (даже операторы создания, такие как Observable.combineLatest(subject)) имеет некоторый способ доступа к источнику.

Другой способ "решить" это - использовать Typescript, потому что TS-компилятор скажет вам, что вы не можете получить доступ к защищенному свойству. source на Observableпоскольку он не является общедоступным атрибутом: https://github.com/ReactiveX/rxjs/blob/master/src/Observable.ts#L30 - конечно, в ES5 нет такой вещи, как "защищенный", и поэтому он будет быть доступным через консоль, например

Другие вопросы по тегам