我正在订阅一个搜索框,并根据该值是否为空或包含字符,从不同的可观察对象获取搜索结果。
this.myservice.searchByKeyword.pipe(
switchMap(keyword => {
if (!keyword || keyword.length === 0) { // true if keyword is empty
return this.someService.GetEmptySearch();
}
return this.someService.GetItems(keyword);
}),
takeUntil(unsubOnDestroy$)
).subscribe({
next: articles: Article[] => {
// Here the result should be handled in the same way, except that if the GetItems observable is returned, I would like to do some conditional with the result.
...
if (getItems was returned) { // pseudocode
// blah blah
}
}
})
我试着返回一个带有枚举的嵌套可观察对象,以指示该条件是否应该运行,但是我还没有使它起作用。
我可以将整个订阅块移动到例如switchMap中的tap操作符中。但这会导致代码重复,我想避免它。
答案 0 :(得分:1)
您可以将管道添加到GetItems
调用中:
this.myservice.searchByKeyword.pipe(
switchMap(keyword => {
if (!keyword || keyword.length === 0) { // true if keyword is empty
return this.someService.GetEmptySearch();
}
return this.someService.GetItems(keyword).pipe(
map((items) => // do what you want here)
)
}),
takeUntil(unsubOnDestroy$)
).subscribe({
next: articles: Article[] => {
}
});
此外,感觉结果直接在模板中使用。您可以将Observable
存储在组件中,并通过异步管道直接使用它。这将减少takeUntil
和subscribe
的代码开销:
readonly articles$ = this.myservice.searchByKeyword.pipe(
switchMap(keyword => {
if (!keyword || keyword.length === 0) { // true if keyword is empty
return this.someService.GetEmptySearch();
}
return this.someService.GetItems(keyword).pipe(
map((items) => // do what you want here)
)
})
);
另一点,考虑到两个调用都来自同一服务,最好在服务内部而不是组件中使用关键字和映射进行逻辑处理