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

Angular RxJs:扫描完成后执行扫描操作,angular,rxjs,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()方法。我的意

我已经编写了这个简单的可观察的代码:

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]

关于如何获得这种行为有什么想法吗?

scan
是一种
reduce
,它不仅能发出最新的值,还能发出所有的减少值。例如,处理状态突变(被视为减少)是很有用的:无论何时发生变化,它都将被进一步发布,从而保证订阅者获得最新状态。但是在您的情况下,需要
reduce
,因为它会发布最新的reduce;因此,如果你不小心进入了无止境的(无限的)流——一个永远不会完成的流——你将无法减少它。

scan
是一种
reduce
,它不仅发出最新的值,还发出所有的减少值。例如,处理状态突变(被视为减少)是很有用的:无论何时发生变化,它都将被进一步发布,从而保证订阅者获得最新状态。但是在您的情况下,需要
reduce
,因为它会发布最新的reduce;因此,如果你不小心进入了无止境的(无限的)流——一个永远不会完成的流——你将无法减少它。

你可以检查这个

和使用:

const{of}=rxjs;
const{reduce,tap}=rxjs.operators;
of(1,2,3)。管道(
减少((acc,值)=>[…acc,值]),
轻触(acc=>{
console.log(“在完成所有还原后”,acc);
})
).subscribe()
您可以签出此

和使用:

const{of}=rxjs;
const{reduce,tap}=rxjs.operators;
of(1,2,3)。管道(
减少((acc,值)=>[…acc,值]),
轻触(acc=>{
console.log(“在完成所有还原后”,acc);
})
).subscribe()

扫描
会发射每个中间累积对象,因此这是预期的行为。我认为您正在寻找
reduce
。如果传递一个值,它将发出一次可观察的
。of([1,2,3])
扫描
会发出每个中间累积对象,因此这是预期的行为。我认为您正在寻找
reduce
。如果传递一个值,它将发出一次-
可观察的([1,2,3])