Как избежать 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(),

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