代码:
const Rx = require('rxjs')
const data = [
{ name: 'Zachary', age: 21 },
{ name: 'John', age: 20 },
{ name: 'Louise', age: 14 },
{ name: 'Borg', age: 15 }
]
const dataSubj$ = new Rx.Subject()
function getDataStream() {
return dataSubj$.asObservable().startWith(data);
}
getDataStream()
.mergeMap(Rx.Observable.from)
.scan((arr, person) => {
arr.push(person)
return arr
}, [])
.subscribe(val => console.log('val: ', val));
使用.reduce(...)代替.scan(...)返回一个空数组,不打印任何内容。 dataSub $的观察者应该接收一个数组
为什么扫描允许数据元素通过,但是不会减少?
注意:我使用的是mergeMap,因为我会在将数组元素还原为单个数组之前对其进行过滤。
答案 0 :(得分:2)
扫描会在每个源项目上发出累计值。
reduce 仅发出最后累积的值。它等待直到源Observable完成,然后才发出累计值。
在您的情况下,依赖于主题的源Observable永远不会完成。因此, reduce 永远不会发出任何值。
您可能希望在 mergeMap 的内部Observable上应用reduce。对于每个数组,内部Observable将在发出所有数组项时完成:
const data = [
{ name: 'Zachary', age: 21 },
{ name: 'John', age: 20 },
{ name: 'Louise', age: 14 },
{ name: 'Borg', age: 15 }
]
const dataSubj$ = new Rx.Subject()
function getDataStream() {
return dataSubj$.asObservable().startWith(data);
}
getDataStream()
.mergeMap(arr => Rx.Observable.from(arr)
.reduce((agg, person) => {
agg.push(person)
return agg
}, [])
)
.subscribe(val => console.log('val: ', val));

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>
&#13;