我已经编写了这个简单易懂的代码:
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]
关于如何获得这种行为的任何想法吗?
答案 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>