angular rx js подписаться на второе наблюдаемое только если первое наблюдаемое равно нулю - PullRequest
0 голосов
/ 30 января 2020

У меня есть два метода, которые возвращают наблюдаемые. Если first возвращает некоторые данные, нет необходимости вызывать второй метод. Но если первый метод возвращает значение null, вызывается только второй метод.

getdefaultAddress(id) : Observable<Address[]> { 
    return this.http.get<Address[]>(this.url + 'users/' + id + '/addresses' + '?filter[where][default]=true')
  }

getFirstAddress(id): Observable<any>{
    return this.http.get<any>(this.url + 'users/' + id +'/addresses?filter[limit]=1'  )
  }

Я могу легко сделать это после подписки на первое наблюдаемое с помощью if-else. Как

this.getdefaultAddress(id).subscibe(data =>{
    if(data) {
      // do something
    }

    else {
      this.getFirstAddress(id).subscibe(data =>{
        // do something
      })
    }
  })

Теперь, как я могу проверить это, не подписавшись на первое наблюдаемое? Любой оператор rx js?

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 30 января 2020
const source1$: Observable<T| null>;
const source2$: Observable<T>;

const finalSource$ = source1$.pipe(
  switchMap(value => value ? of(value) : source2$) 
)

Вы возвращаете внешний источник, если он имеет значение. В тот момент / событие, когда оно становится неопределенным / ноль, вы переключаетесь на source2 $.

1 голос
/ 30 января 2020

Полагаю, вы можете использовать оператор switchMap, я не могу проверить в данный момент.

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

this.getdefaultAddress(id).pipe(
  switchMap(data => {
    if (!data) {
      return this.getFirstAddress(id);
    }
  })
);
1 голос
/ 30 января 2020

Лучше использовать, например, concatMap:

import { EMPTY } from 'rxjs';
import { concatMap } from 'rxjs/operators';

this.getdefaultAddress(id)
  .pipe(
    concatMap(data => data === null ? EMPTY : this.getFirstAddress(id)),
  )
  .subscribe();
...