【问题标题】:Reduce returns empty array, however scan does not减少返回空数组,但扫描不
【发布时间】:2018-02-22 05:44:21
【问题描述】:

代码:

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$ 的观察者应该收到一个数组。
为什么 scan 允许数据元素通过,而 reduce 不允许?
注意:我使用的是 mergeMap,因为我会先过滤数组的元素,然后再将它们还原为单个数组。

【问题讨论】:

    标签: rxjs reactive-programming


    【解决方案1】:

    scan 在每个源项上发出累积值。

    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>

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 2012-04-21
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      相关资源
      最近更新 更多