typescript - 结合 oberables rxjs 5.5+
问题描述
考虑以下获取实体并为每个 ID 属性加载相关模型的代码(加载外键对象):
if (!lazyLoad) {
return this.http.get(`${environment.endpoint}/file`, {
params: params
}).pipe(
mergeMap(res => this.loadModel(res, 'prop1ID')),
mergeMap(res => this.loadModel(res, 'prop2ID')),
mergeMap(res => this.loadModel(res, 'prop2ID'))
)
}
}
第一个合并工作,第二个得到undefind
。试图阅读merge
并mergeAll
没有成功。
http
请求中的对象如下所示:
{
id: '1',
name: 'user',
prop1ID: 34,
prop2ID: 44,
prop3ID: 54
}
在这三个动作之后,我希望它看起来像(在loadModel()
功能的帮助下):
{
id: '1',
name: 'user',
prop1ID: 34,
prop1IDModel: { ... },
prop2ID: 44,
prop2IDModel: { ... },
prop3ID: 54
prop3IDModel: { ... },
}
我的loadModel
功能:
private loadModel(entity, modelProperty): Observable<object> {
switch (modelProperty) {
case 'prop1ID':
this.generalService.getProp1ID(entity.prop1ID).subscribe((data) => {
entity.prop1IDModel = data;
return of(entity);
});
break;
case 'prop2ID':
...
break;
case 'prop3ID':
...
break;
default:
return of(entity);
}
}
解决方案
你的 switch 语句实际上并没有返回一个 Observable——使用订阅中的语句,如果 Observable 涉及异步任务return
,你总是会在返回任何内容之前到达该语句。break
正如@martin 建议的那样,我将重构 loadModel() 以返回 Observable:
private loadModel(entity, modelProperty): Observable<object> {
switch (modelProperty) {
case 'prop1ID':
return this.generalService.getProp1ID(entity.prop1ID)
.mergeMap((data) => {
entity.prop1IDModel = data;
return Observable.of(entity);
});
break;
// etc.
推荐阅读
- android - 如何在 Android 中以编程方式截屏并分享
- javascript - 如何获取有关随机智能合约地址的数据。如创建日期、链表、持有者(持有多少个钱包)
- kdb - 如何计算 KDB 中的 30 天滚动窗口?
- mysql - MySQL 查询以根据自定义列名和值获取值
- python - 如何在 selenium webdriver 中修复此错误?
- php - MySQL Query 查找所有值匹配的标记的所有订阅
- javascript - 2021 年悬停下拉菜单是否适用于移动设备?
- javascript - 试图在条形图 d3.js 中获取 y 轴标签旁边的圆圈
- list - 什么是flutter Hive相当于removeWhere?
- reactjs - 通过嵌套数组中的 ID 显示数据库中的数据