【发布时间】:2019-10-09 21:47:36
【问题描述】:
我有三个 observable foo$、bar$ 和 baz$,我将它们合并在一起形成另一个 observable。这按预期工作:
- 流以
>>>开头 - 每个值一个一个地发出
- 流以
<<<结尾
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>
现在,如果上面的三个 observable 都没有发出值,我不想输出 >>> 和 <<<。所以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() 没有产生任何值。
问题:如果 observable 没有发出单个值,如何防止 startWith 和 endWith 执行?
【问题讨论】: