2016-12-21 3 views
2

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

Пример:

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" 

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

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

ответ

1

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

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

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

+0

Цените ответ! К сожалению, я не работаю в среде TypScript. Есть ли действительный, небедово используемый случай для доступа к источнику от потребителя наблюдаемого? Это должно быть явным выбором. Полностью можно инкапсулировать состояние в JS, поэтому я не покупаю, что источник должен быть выставлен, или, по крайней мере, механизм по умолчанию для просмотра наблюдаемых для потребителей должен его выставить. –

+0

Это абсолютно правильно, что в JS есть допустимые способы сделать это - я бы поставил наилучшее решение открыть проблему github. Из того, что я знаю, это то, что rxjs5 был построен с TS в виду, но это очень быстро угасает, для чего это не так. – olsn