RxJS组通过不获取订阅值

时间:2019-07-11 20:22:06

标签: javascript angular typescript rxjs

我在一个由StockPrices组成的MongoDB实例中有很长的清单,具有以下属性:

  • 时间戳
  • 符号
  • 价格

我想按符号对它们进行分组。我使用一个可观察对象获取StockPrices的列表并将其注入到组件中,这是这样的:

import {Component, OnInit} from '@angular/core';
import {ActivatedRoute} from '@angular/router';
import {StockPrice} from '../../model';
import {flatMap, groupBy, mergeMap, toArray} from 'rxjs/operators';
import {of, zip} from 'rxjs';

@Component({
    selector: 'compare-chart',
    templateUrl: './compare-chart.component.html',
    styleUrls: ['./compare-chart.component.scss']
})
export class CompareChartComponent implements OnInit {

    constructor(private route: ActivatedRoute) {
    }

    ngOnInit() {
        this.route.data.pipe(
            flatMap((data: { stockPrices: StockPrice[] }) => data.stockPrices),
            groupBy(stockPrice => stockPrice.symbol),
            mergeMap(group => zip(of(group.key), group.pipe(toArray())))
        ).subscribe(console.log);
    }

}

由于某种原因,控制台没有发出并显示任何值,但是我确实看到从服务器检索了StockPrices列表。 我尝试了rxjs.devlearnrxjs.io的所有提示。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

flatMap期望返回一个observable,看来您想要执行的是:

flatMap((data: { stockPrices: StockPrice[] }) => from(data.stockPrices)),

from会将数组转换为flatMap可以对其进行操作的可观察流,以便groupBy可以做到这一点。

值得注意的是,这并不是严格的必要条件,您可以只使用map运算符和lodash或soemthing之类的同步groupBy工具。

groupBy是一种复杂的运算符,仅当您希望对实际流进行分组时(例如,如果您有来自Web套接字或轮询器的实时股票价格流),才真正需要它。