Как создать 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.


person Adam Arthur    schedule 21.12.2016    source источник


Ответы (1)


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

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

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

person olsn    schedule 21.12.2016
comment
Ценю ответ! К сожалению, я не работаю в среде Typescript. Есть ли допустимый вариант использования без взлома для доступа к источнику от потребителя наблюдаемого? Это должно быть явное согласие. Вполне возможно инкапсулировать состояние в JS, поэтому я не верю, что источник должен быть открыт или, по крайней мере, механизм по умолчанию для предоставления наблюдаемых потребителям должен раскрывать его. - person Adam Arthur; 22.12.2016
comment
Абсолютно правильно, что в JS есть допустимые способы сделать это - лучше всего было бы открыть проблему с github. Насколько я знаю, rxjs5 был построен с учетом TS, но это очень быстро становится самоуверенным, а это неправильное место. - person olsn; 22.12.2016