我应该在Angular中使用switchMap,flatMap或任何其他rxjs运算符

时间:2017-11-06 13:35:47

标签: angular rxjs

我有两个数据流,第二个依赖于第一个,但我希望能够捕获第二个数据。我写了两个用于创建observable的函数。我想知道这个实现是否正确。

b

1 个答案:

答案 0 :(得分:0)

如果您可以更具体地了解您的要求,那将会有所帮助,但据我所知,它看起来很好。

我认为您可能希望使用switchMap而不是flatMap。 FlatMap将维护多个内部订阅,而SwitchMap仅维护对最新内部可观察的订阅。因此,如果您只想根据源的输出从内部observable获取值,那么switchMap将会这样做。

不确定您的用例,但您可能需要考虑应用过滤器而不是返回Observable.empty()。

以下是一个例子:

const firstObservable = Rx.Observable.create((o) => {
  o.next();
  setTimeout(() => o.next(1), 1000);
  setTimeout(() => o.next(), 2000);
  setTimeout(() => o.next(2), 3000);
  setTimeout(() => o.complete(), 4000);
}).do(console.log.bind(null, 'first: next'),
    console.log.bind(null, 'first: error'),
    console.log.bind(null, 'first: complete'));
const secondObservable = (x) => Rx.Observable.interval(x * 500).take(5)
  .do(console.log.bind(null, 'second: next'),
    console.log.bind(null, 'second: error'),
    console.log.bind(null, 'second: complete'));

firstObservable.filter(x => x).switchMap(x => secondObservable(x))
  .subscribe(console.log.bind(null, 'stream: next'),
    console.log.bind(null, 'stream: error'),
    console.log.bind(null, 'stream: complete'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.js"></script>