我在一个由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.dev和learnrxjs.io的所有提示。
有什么想法吗?
答案 0 :(得分:1)
flatMap期望返回一个observable,看来您想要执行的是:
flatMap((data: { stockPrices: StockPrice[] }) => from(data.stockPrices)),
from
会将数组转换为flatMap可以对其进行操作的可观察流,以便groupBy可以做到这一点。
值得注意的是,这并不是严格的必要条件,您可以只使用map运算符和lodash或soemthing之类的同步groupBy工具。
groupBy是一种复杂的运算符,仅当您希望对实际流进行分组时(例如,如果您有来自Web套接字或轮询器的实时股票价格流),才真正需要它。