RxJs:扫描完成后执行扫描操作

时间:2019-05-07 10:17:05

标签: angular rxjs

我已经编写了这个简单易懂的代码:

Observable.of(1, 2, 3)
    .scan((acc, value) => [...acc, value], [])
    .do(acc => {     
        console.log(acc);
    })
    .subscribe();

控制台输出为:

Array(1) [1]
Array(2) [1, 2]
Array(3) [1, 2, 3]

我认为.do()方法应在扫描完成后执行。我的意思是,我期望一个控制台输出:

Array(3) [1, 2, 3]

关于如何获得这种行为的任何想法吗?

2 个答案:

答案 0 :(得分:0)

scan是一种reduce,它不仅发出最新值,还发出所有减少值。例如,处理状态突变是有用的,这被视为减少:只要发生更改,它就会被进一步发布,从而保证订户获得最新状态。但是,根据您的情况,reduce是必需的,因为它会发布最新的简化版本;结果,如果您不小心进入了无限(无限)的流中-永远不会完成的流-您将无法减少它。

答案 1 :(得分:0)

您可以检出此topic

并使用reduce

const { of } = rxjs;
const { reduce, tap } = rxjs.operators;

of(1, 2, 3).pipe(
  reduce((acc, value) => [...acc, value], []),
  tap(acc => {     
      console.log('after all the reduction is complete', acc);
  })
).subscribe();
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.js"></script>