Reduce返回空数组,但扫描没有

时间:2018-02-21 16:18:56

标签: rxjs reactive-programming

代码:

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,因为我会在将数组元素还原为单个数组之前对其进行过滤。

1 个答案:

答案 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;
&#13;
&#13;