Как создать 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 нет такой вещи, как "защищенный", и поэтому он будет быть доступным через консоль, например