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])