如何在嵌套的 Observable 中 return 一个 Observable?
How to return an Observeble within nested Observables?
我有两个嵌套的 observable,第一个 observable 提供了一个 ID,该 ID 作为参数传递给第二个 observable userTypeID
。
目标是 return 一个基于 actionType
的 Observable,它可以是 view
或 edit
以便做这样的事情。
// returns view object
getPresentationFields('view').subscribe(data => console.log(data));
// returns edit object
getPresentationFields('edit').subscribe(data => console.log(data));
但是,由于我已经在 getPresentationFields(...)
中订阅了 Observables,所以我不能订阅上面写的函数本身。
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')
或 getPresentationFields('edit')
的参数 return 一个 Observable?
不需要在getPresentationFields
代码中订阅,直接通过Observable即可。
粗略示例(不确定 return 需要 view/edit 的哪一部分配置)
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。
甚至可能发生您实际上并未在代码中订阅,而是将可观察对象传递到外部某处,例如 angular | async
或 redux effects
!
所以大多数情况下,您将使用 switchMap, mergeMap, combineLatest 等运算符来处理您的数据并将其传递给订阅,这将变得尽可能薄。
我有两个嵌套的 observable,第一个 observable 提供了一个 ID,该 ID 作为参数传递给第二个 observable userTypeID
。
目标是 return 一个基于 actionType
的 Observable,它可以是 view
或 edit
以便做这样的事情。
// returns view object
getPresentationFields('view').subscribe(data => console.log(data));
// returns edit object
getPresentationFields('edit').subscribe(data => console.log(data));
但是,由于我已经在 getPresentationFields(...)
中订阅了 Observables,所以我不能订阅上面写的函数本身。
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')
或 getPresentationFields('edit')
的参数 return 一个 Observable?
不需要在getPresentationFields
代码中订阅,直接通过Observable即可。
粗略示例(不确定 return 需要 view/edit 的哪一部分配置)
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。
甚至可能发生您实际上并未在代码中订阅,而是将可观察对象传递到外部某处,例如 angular | async
或 redux effects
!
所以大多数情况下,您将使用 switchMap, mergeMap, combineLatest 等运算符来处理您的数据并将其传递给订阅,这将变得尽可能薄。