Как избежать Rx.Subject в конструкторе функций, но все же разрешить ранних подписчиков
Я использую объектно-ориентированный JavaScript с rxjs и ищу "хорошее" решение / лучший способ инициализации переменной-члена, которая позже должна быть наблюдаемой последовательностью, в функции конструктора.
Что я делаю сейчас:
var myObject = function() {
this.observableSequence = new Rx.Subject();
};
myObject.prototype.connect = function(somePromise) {
var self = this;
somePromise.done(function(anotherSequence) {
anotherSequence.forEach(function(element) {
self.observableSequence.onNext(element);
});
});
};
В приведенном выше примере (который работает как есть) я, в основном, жду, когда внешнее обещание (переданное потребителем библиотеки, находящееся вне моего контроля) разрешит, а затем начнет передавать элементы из одной наблюдаемой последовательности в другую последовательность.
Я думаю, что я делаю что-то не так из-за большого количества служебного кода. Единственная причина, по которой я использовал Rx.Subject
должен позволить другим внешним подписчикам подписаться на observableSequence
до завершения обещания. Но для моих потребителей API я хочу, чтобы детали метода.connect() были скрыты. Потребитель должен просто увидеть observableSequence
член и сможет подписаться на него в любое время.
Я предпочел бы иметь решение без Rx.Subject
(как некоторые предполагают, Rx.Subject не должен использоваться, поскольку он является изменчивым), и мне также интересно, есть ли лучший способ выполнить "конвейеризацию" между наблюдаемыми последовательностями.
1 ответ
Альтернатива без Rx.Subject() будет иметь this.observableSequence
описан полностью внутри конструктора, но вам понадобится ссылка на будущее somePromise
, сказать proxyToSomePromise
, Полезно иметь proxyToSomePromise
быть наблюдаемым, чтобы его можно было использовать для расчета this.observableSequence
, По сути, мы возвращаемся к той же проблеме: proxyToSomePromise
должен быть Rx.Subject(), так как somePromise
еще не доступен
Я не вижу, как вы можете избежать субъекта. В большинстве случаев вы можете использовать чистые наблюдаемые, но у субъектов есть свой вариант использования, они необходимы. Они также являются основной частью Cycle.js. Его изменчивость не проблема, если вы инкапсулируете предмет из внешнего мира, то есть используете asObservable()
,