有没有一种方法可以简化具有类似订阅的条件switchMap操作?

时间:2019-10-15 07:01:42

标签: angular rxjs

我正在订阅一个搜索框,并根据该值是否为空或包含字符,从不同的可观察对象获取搜索结果。

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操作符中。但这会导致代码重复,我想避免它。

1 个答案:

答案 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存储在组件中,并通过异步管道直接使用它。这将减少takeUntilsubscribe的代码开销:

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)
   )
  })
);

另一点,考虑到两个调用都来自同一服务,最好在服务内部而不是组件中使用关键字和映射进行逻辑处理