У меня есть три наблюдаемые foo$
, bar$
и baz$
, которые я объединяю, чтобы сформировать другую наблюдаемую.Это работает, как и ожидалось:
- Поток начинается с
>>>
- Каждое значение отправляется одно за другим
- Поток заканчивается
<<<
const foo$ = of('foo');
const bar$ = of('bar');
const baz$ = of('baz');
merge(foo$, bar$, baz$).pipe(startWith('>>>'), endWith('<<<')).subscribe(str => {
console.log(str);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.2/rxjs.umd.min.js"></script>
<script>const {merge, of} = rxjs; const {startWith, endWith} = rxjs.operators;</script>
Теперь, если ни одна из трех вышеприведенных наблюдаемых не выдает значения, я не хочу выводить ни >>>
, ни <<<
.Таким образом, startWith
и endWith
могут "запускаться" только в том случае, если merge(foo$, bar$, baz$)
действительно излучает значение.
Для того, чтобы смоделировать, что я отклоняю все значения, испускаемые foo$
, bar$
и baz$
с функцией фильтрации.
const foo$ = of('foo').pipe(filter(() => false));
const bar$ = of('bar').pipe(filter(() => false));
const baz$ = of('baz').pipe(filter(() => false));
merge(foo$, bar$, baz$).pipe(startWith('>>>'), endWith('<<<')).subscribe(str => {
console.log(str);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.2/rxjs.umd.min.js"></script>
<script>const {merge, of} = rxjs; const {startWith, endWith, filter} = rxjs.operators</script>
Однако, как вы можете видеть на выходе, и startWith
, и endWith
выдали свое значение, хотя merge()
не произвело никакого.
Вопрос : Как я могу предотвратить выполнение startWith
и endWith
, если наблюдаемое не испустило ни одного значения?