angular - GroupBy 转换运算符仅在本地环境中工作
问题描述
我正在尝试重构代码,同时我发现了一个我想了解的错误。它适用于本地环境,但不适用于 QA 环境。数据:
const dataSet: DataSetInterface[] = [
{ id:57, firstProperty:148, secondProperty:1, thirdProperty:10.30 },
{ id:58, firstProperty:149, secondProperty:4, thirdProperty:20.60 },
{ id:59, firstProperty:148, secondProperty:4, thirdProperty:22.20 }
];
旧方法不起作用:
private groupAndSumUp(dataSet: DataSetInterface[]) {
Rx.Observable.from(dataSet)
.groupBy(x => x.secondProperty)
.flatMap(group => group.toArray())
.map(g => {
return {
id: g[0].secondProperty,
secondProperty: g[0].thirdProperty,
budgetDays: _.sumBy(g, 'budgetDays'),
}
})
.toArray()
.subscribe(d => this.budgetDays = d);
}
在本地它正在工作,但在 QA 环境中我收到一个错误:
ERROR TypeError: e.map is not a function
我不知道为什么。也许那是因为 GroupedObservables 在第一个方法 toArray() 之前没有完成?
我将尝试重构,但它尚未经过测试,在此之前我想了解为什么它在 QA 中无法正常工作。示例我想如何重构它:
const example = source.pipe(
groupBy(x => x.id),
mergeMap(group => group.pipe(toArray())),
map(g => {
return {
id: g[0].secondProperty,
secondProperty: g[0].thirdProperty,
budgetDays: _.sumBy(g, 'budgetDays'),
}
}),
toArray()
);
更新
我试过重构版本:
private groupAndSumUp(pricingLevels: SingleContractWorkPackagePricingLevel[]) {
from(pricingLevels).pipe(
groupBy(x => x.masterAgreementPricingLevelId),
mergeMap(group => group.pipe(toArray())),
map(g => {
return {
id: g[0].masterAgreementPricingLevelId,
masterAgreementPricingLevel: g[0].budgetDays,
budgetDays: _.sumBy(g, 'budgetDays'),
}
}),
toArray()
).subscribe(d => this.budgetDays = d);
}
现在我有错误: ERROR TypeError: Vn.a.from(...).groupBy is not a function
我的进口:
import { from } from 'rxjs';
import { groupBy, map, mergeMap, toArray } from 'rxjs/operators';
import * as _ from 'lodash';
import { Observable } from 'rxjs/Observable';
Rxjs 版本:
"rxjs": "^6.6.7",
"rxjs-compat": "^6.6.7",
我的错误发生了变化:
ERROR TypeError: Cannot set property 'checked' of undefined
at 7-es2015.23db786fc6208d7e819e.js:1
at Array.forEach (<anonymous>)
at t.setSelectedDays (7-es2015.23db786fc6208d7e819e.js:1)
at t.ngOnChanges (7-es2015.23db786fc6208d7e819e.js:1)
at t.We (main-es2015.1967bf97e6c77b08a1d5.js:1)
at Ut (main-es2015.1967bf97e6c77b08a1d5.js:1)
at $t (main-es2015.1967bf97e6c77b08a1d5.js:1)
at Vt (main-es2015.1967bf97e6c77b08a1d5.js:1)
at Zi (main-es2015.1967bf97e6c77b08a1d5.js:1)
at main-es2015.1967bf97e6c77b08a1d5.js:1
解决方案
我只能假设它不起作用,因为它找不到.map
操作员。如果您不使用以下导入语句,这会以旧的 rxjs 方式发生:
import 'rxjs/add/operator/map';
现在可能是在 QA 环境中,应用程序被优化和缩小,map
无法再找到操作员。如果您尚未访问某个页面(其中包含该导入),则可能会发生这种情况。要“修复”它,您需要将该导入放入实际使用 map 运算符的文件中。
但是,您的重构显然是适当的修复。
推荐阅读
- c# - C# Windows 窗体应用程序如何初始化数组一次而不是每次发生按钮事件时
- android - 哪个是为 android 设计 UI(编码或拖放)的最佳方式?
- python-3.x - 使用语音识别从非常大的 wav 文件中提取文本
- xpath - 如何使用xpath在两个h标签之间选择包含一些文本的元素
- python - 如何使用 seaborn 绘制条形图?
- flutter - 如何检查 Dart List 是否包含某个对象实例?
- java - 检查验证并从编辑文本传递值以移动活动
- amazon-s3 - 在尝试将文件上传到 S3 时,通过 amplify CLI for Android 项目导入 S3 存储会引发 403 未经身份验证的错误
- r - R ggplot 基于条件的垂直线,但在 facet_grid 命令之后?
- powershell - powershell 计划作业无法运行