angular - 如何在嵌套的 Observables 中返回 Observable?
问题描述
我有两个嵌套的 observable,第一个 observable 提供了一个 ID,它作为参数传递给第二个 observable userTypeID
。
目标是返回一个 Observable 基于actionType
which 可以是view
或者edit
为了做这样的事情。
// returns view object
getPresentationFields('view').subscribe(data => console.log(data));
// returns edit object
getPresentationFields('edit').subscribe(data => console.log(data));
但是,由于我已经订阅了 内的 Observables getPresentationFields(...)
,所以我不能订阅上面写的函数本身。
getPresentationFields(actionType: string) {
this.customerService.getUserByID(this.id).subscribe(user => {
this.presConfigService.getPresConfig(user.userTypeID).pipe(
flatMap((configs) => configs), // ----[obj1, obj2, obj3]----
filter((configs) => configs.show) // ----obj1----obj2----obj3----
).subscribe(() => {
if(actionType == 'view'){
// Return View Observable
}else if(actionType == 'edit'){
// Return Edit Observable
}
});
});
}
如何根据传递给getPresentationFields('view')
or的参数返回 Observable getPresentationFields('edit')
?
解决方案
无需订阅getPresentationFields
代码,只需通过 Observable 即可。
粗略示例(不确定您需要返回配置的哪一部分以进行查看/编辑)
function getPresentationFields(actionType: string) {
return this.customerService
.getUserByID(this.id)
.pipe(
switchMap(user => this.presConfigService.getPresConfig(user.userTypeID)),
flatMap((configs) => configs),
filter((configs) => {
if(actionType == 'view'){
return configs.show;
}else if(actionType == 'edit'){
return configs.edit;
}
})
)
}
或者你可以在更高的地方有一个 if-else:
function getPresentationFields(actionType: string) {
const result$ = this.customerService
.getUserByID(this.id)
.pipe(
switchMap(user => this.presConfigService.getPresConfig(user.userTypeID))
);
if(actionType == 'view'){
return result$.pipe(
// ... get view data
);
} else if(actionType == 'edit'){
return result$.pipe(
// ... get edit data
)
}
}
通常,您只需要在消费结果的地方订阅 Observable。
甚至可能发生您实际上并没有订阅您的代码,而是将 observable 传递给外部某处,例如使用angular | async
or redux effects
!
因此,大多数情况下,您将使用switchMap、mergeMap、combineLatest等运算符来处理您的数据并将其传递给订阅,这将变得尽可能薄。
推荐阅读
- amazon-web-services - 无法通过 Internet 访问在 AWS EC2 上运行的 Grafana 仪表板
- php - 如何处理php中的静态变量
- cmake - 在 Cmake 脚本中映射
- python - 如何在使用 Faker 生成假数据时在 python 中链接字段?
- html - css position issue displaying epub file
- dataframe - HDFStore sys:1: 性能警告 - 您的性能可能会受到影响,因为 PyTables 会腌制它无法处理的对象类型
- mysql - ef脚手架时出现“指定要使用的项目文件...”错误
- android - Flutter Hive - 如何从框中列出对象作为选择字段元素
- flutter - 我有一个基于颤振的应用程序。当手机灯关闭且手机处于睡眠模式时,我的应用程序无法运行
- c# - .net 核心与 httpclient 请求删除和正文