BehaviorSubject сопоставляет BehaviorSubject

У меня есть rxjs@6 BehaviorSubject source$, я хочу получить подзначение от source$

  const source$ = new BehaviorSubject(someValue);
  const subSource$ = source$.pipe(map(transform));

Я ожидаю, что subSource$ также является BehaviorSubject, но это не так, и как я могу получить, что subSource$ является BehaviorSubject?


person quanwei li    schedule 09.07.2018    source источник
comment
Почему вы ожидаете, что это будет субъект и как он будет себя вести?   -  person a better oliver    schedule 09.07.2018
comment
Я использую github.com/facebook/react/tree/master/packages/ для реакции. там нужен объект поведения в качестве реквизита. Я хочу разделить поведение субценности на различный компонент.   -  person quanwei li    schedule 09.07.2018


Ответы (1)


Когда BehaviorSubject передается по конвейеру, он использует AnonymousSubject, как и обычный Subject. Таким образом, возможность вызова getValue() не передается по цепочке. Это было решение сообщества. Я согласен (как и некоторые другие), что было бы неплохо, если бы существовала возможность получить значение после конвейерной обработки, но, увы, это не поддерживается.

Итак, вам нужно будет сделать что-то вроде:

const source$ = new BehaviorSubject(value);
const published$ = new BehaviorSubject(value);
const subSource$ = source$.pipe(...operators, multicast(published$));

Затем вы можете вызвать getValue() для publish$, чтобы получить значение после того, как оно пройдет через ваши операторы.

Обратите внимание, что вам нужно будет либо вызвать connect() для subSource$ (что сделает его «горячим» наблюдаемым), либо использовать refCount().

Тем не менее, на самом деле это не самый rxjs-ишный способ делать вещи. Итак, если у вас нет конкретной причины для динамического получения значения после того, как оно проходит через вашего оператора, а не просто для подписки на него в потоке, может быть, переосмыслить подход?

person Josh    schedule 13.12.2018