Есть ли способ упростить условные операции switchMap с похожими подписками? - PullRequest
0 голосов
/ 15 октября 2019

Я подписываюсь на окно поиска и, основываясь на том, что значение пустое или содержит символы, получаю результаты поиска из различных наблюдаемых.

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

Я поиграл с возвращением вложенной наблюдаемой с перечислениемчтобы указать, что условие должно быть запущено или нет, но я еще не заставил его работать.

Я мог бы переместить весь блок подписки, например, оператор tap в switchMap. Но это приведет к дублированию кода, и я бы хотел этого избежать.

1 Ответ

1 голос
/ 15 октября 2019

Вы можете добавить канал к вызову 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)
   )
  })
);

Еще один момент, учитывая, что оба вызова поступают из одной и той же службы, удобнее выполнять логику с ключевым словом и отображением внутри службыи не в компоненте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...