angular - Angular HttpClient“内部连接”单独的 API 调用
问题描述
我创建了一个 API,用于存储有关它们的装置和特征的列表。我可以拉出所有灯具的列表(可能已过滤)。
我还创建了一个单独的 API,为现有数据源提供接口。该数据源记录了灯具的使用实例,API 提供了自给定日期以来灯具使用时间的总和。由于每个灯具都有不同的日期,我必须进行单独的 API 调用。不幸的是,由于一些公司的安全区域政策,我不能只在后端进行合并,我必须在前端进行。
我的目标是创建一个 Angular 服务,它返回一个可观察的固定装置列表以及它们的使用时间。
我试过使用mergeMap,并循环遍历结果列表,为正确的fixture调用服务,但这从未调用过,我认为它只创建了observable,但没有订阅。订阅引发了不同的错误。我希望我保存了所有尝试,但我将在下面展示我所拥有的。
我在组件中使用此代码调用此函数,并将其显示在表格中:
getFixturesTable() {
this.fixtureListService.getFixturesTable()
.subscribe(fixtures => {
this.fixtureSource = new MatTableDataSource<FixtureListModel>(fixtures);
this.fixtureSource.paginator = this.paginator;
this.fixtureSource.sort = this.sort;
});
}
这个没有得到我应用适配器的最终映射的列表,它只传递一个对象,而不是数组,即使我返回的是固定装置而不是固定装置。错误是“data.map 不是函数”。
public getFixturesTable(
fixtureSerial = '',
): Observable<FixtureListModel[]> {
return this.fixtures.getFixtures(fixtureSerial).pipe(
mergeMap((fixtures: any[]) => {
fixtures.map((fixture: any) => {
this.times.getSerialDuration(fixture.serial, fixture.latest_inspection).pipe(
map(use => fixture.duration = use.duration)
);
});
return fixtures;
}),
map((data: any[]) => {
console.log(data);
return data.map(item => this.fixtureListAdapter.adapt(item));
}
)
);
}
这个实际上执行了 api 调用,但它们来晚了,并且永远不会被应用到夹具对象上,至少据我所知。我认为这与在地图中使用 .subscribe 函数有关,但我读过这可能是不好的做法。
public getFixturesTable(
fixtureSerial = '',
): Observable<FixtureListModel[]> {
return this.fixtures.getFixtures(fixtureSerial).pipe(
mergeMap((fixtures: any[]) => {
console.log('looping');
fixtures.map((fixture: any) => {
console.log(fixture);
this.times.getSerialDuration(
fixture.serial,
fixture.latest_inspection,
).subscribe( agg =>
fixture.duration = agg.duration
);
console.log(fixture);
return fixture;
});
return fixtures;
}),
map((data: any[]) => data.map(item => this.fixtureListAdapter.adapt(item))
));
}
我希望我已经保存了一些其他接近的尝试,但不幸的是它们已经丢失了。
我想我真正想做的是使用 Observables 和 HttpClient 执行“内部连接”。如果它再次出现,我想找到一个通用的方法来执行此操作,但在这种情况下,我只需将“fixtures.duration”字段添加到夹具对象,然后将其显示在表格中。
解决方案
所以我得到了这个工作,我想我可能一直在看错误的结果。无论哪种方式,我都不喜欢地图内的订阅调用,除非这是最好的方法。
public getFixturesTable(
fixtureSerial = '',
): Observable<FixtureListModel[]> {
return this.fixtures.getFixtures(fixtureSerial).pipe(
map((data: any[]) => data.map(item => this.fixtureListAdapter.adapt(item))),
map(fxs => {
fxs.map(fixture => {
this.times.getSerialDuration(
fixture.serial.toString(),
fixture.latestInspection)
.subscribe(time => fixture.usedTime = time.duration);
});
return fxs;
}),
);
}
推荐阅读
- c# - 为什么 void Main 在 if 条件之后不启动?
- python - 如何使用 Django 发送电子邮件以重置密码?
- c# - 如何为图像使用两次属性?
- cassandra - Cassandra 是如何不一致的,而 HBase 是一致的?
- java - webview没有加载带有服务器地址的url,例如(http://192.168.2.5:portnumber/index)
- typescript - 强制转换对象文字
- mysql - 获取当月 Crystal Reports 公式的周数
- typescript - 从枚举键计算字符串的联合
- mongodb - 带有自身数据的 MongoDB 条件查询
- postgresql - 为什么我在输入结束时收到错误:语法错误?