Фильтрация поведения объекта - PullRequest
1 голос
/ 05 апреля 2019

У меня есть BehaviorSubject, который я хотел бы иметь в состоянии filter, но при этом поддерживаю свое поведение в соответствии с тематикой поведения, так что новые подписчики всегда получают значение при подписке, даже если последнее испущенное значение было отфильтровано из. Есть краткий способ сделать это, используя встроенные функции из rxjs? Например:

const isEven = (n) => n % 2 === 0;
const source = new BehaviorSubject(1);
const stream = source.pipe(filter(isEven));
stream.subscribe((n) => console.log(n)); // <- I want this to print `1`
source.next(2); // prints `2`; that's good
source.next(3); // does not print anything; that's good

Я написал свою собственную реализацию, но предпочел бы более простое решение, используя вместо этого существующие операторы, если это просто.

Ответы [ 3 ]

2 голосов
/ 05 апреля 2019

Просто используйте второй BehaviorSubject

const { BehaviorSubject } = rxjs;
const { filter} = rxjs.operators;

const isEven = (n) => n % 2 === 0;
const source = new BehaviorSubject(1);
const stream = new BehaviorSubject(source.getValue());

source.pipe(filter(isEven)).subscribe(stream);

stream.subscribe(val => { console.log(val); });
source.next(2);
source.next(3);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>
0 голосов
/ 09 апреля 2019

Ответ Адриана заслуживает доверия, похоже, он отвечает наилучшим образом, учитывая встроенные операторы, доступные в самой rxjs.Это не совсем соответствовало моим потребностям, поэтому я опубликовал свой пользовательский оператор в моей маленькой библиотеке s-rxjs-utils.Это оно называется filterBehavior().Из документов:

Работает как filter(), но всегда пропускает первую эмиссию для каждого нового подписчика.Это делает его подходящим для подписчиков, которые ожидают, что наблюдаемое будет вести себя как BehaviorSubject, где первое излучение обрабатывается синхронно во время вызова к subscribe() (например, канал async в угловом шаблоне).

0 голосов
/ 05 апреля 2019

Ваш stream уже настроен на использование фильтра isEven, поэтому ваше начальное значение 1 не отображается на консоли и ведет себя как ожидалось.

Если вы хотите увидеть ваше начальное значениеиз 1, подпишитесь непосредственно на BehaviourSubject:

const isEven = (n) => n % 2 === 0;
const source = new BehaviorSubject(1);
const stream = source.pipe(filter(isEven));

// should print 1, and should print 2 and 3 when your source is nexted.
source.subscribe((n) => console.log(n)); 

stream.subscribe((n) => console.log(n)); // <- should NOT Print 1, because it has been filtered
source.next(2); // prints `2`; that's good
source.next(3); // does not print anything; that's good
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...