rxjs zip two switchMap?

У меня есть определение behaviorSubject:

measurementSearchChange$ = new BehaviorSubject('');
this.measurementSearchChange$
  .asObservable()
  .pipe(debounceTime(500))
  .pipe(
    switchMap((keyword: string) =>
      this.warningService.getInfluxdbQuery(
        this.selectedMonitorOption,
        'measurement',
        { search_name: keyword }
      )
    )
  )
  .subscribe((data: any) => {
    this.measurementOptions = data;
    this.isLoading = false;
  });

когда какое-то действие будет делать это:

this.measurementSearchChange$.next(keyword);

сейчас он работает хорошо, но я хочу добавить switchMap и заархивировать их, чтобы я мог подписаться на два разных данных, например :

this.measurementSearchChange$
  .asObservable()
  .pipe(debounceTime(500))
  .pipe(
    switchMap((keyword: string) =>
      this.warningService.getInfluxdbQuery(
        this.selectedMonitorOption,
        'measurement',
        { search_name: keyword }
      )
      // another 
      this.warningService.getInfluxdbQuery2(
        this.selectedMonitorOption,
        'measurement2',
        { search_name: keyword }
      )
    )
  )
  .subscribe((data1: any, data2: any) => {
    this.measurementOptions = data;
    this.isLoading = false;
  });

так как это сделать? любая помощь ценится


person dyh333    schedule 06.07.2018    source источник


Ответы (1)


Если ваши запросы выдают один результат, а затем завершаются, вы можете использовать forkJoin, например:

import { forkJoin } from 'rxjs';
/* ... */
this.measurementSearchChange$
  .asObservable()
  .pipe(
    debounceTime(500),
    switchMap((keyword: string) => forkJoin(
      this.warningService.getInfluxdbQuery(
        this.selectedMonitorOption,
        'measurement',
        { search_name: keyword }
      ),
      this.warningService.getInfluxdbQuery2(
        this.selectedMonitorOption,
        'measurement2',
        { search_name: keyword }
      )
    ))
  )
  .subscribe(([data1, data2]: [any, any]) => {
    this.measurementOptions = data;
    this.isLoading = false;
  });

Если они выдадут несколько результатов, используйте combineLatest вместо forkJoin.

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

person cartant    schedule 06.07.2018
comment
Это должен быть forkJoin вместо Observable.forkJoin? - person siva636; 06.07.2018
comment
@ siva636 Да, так и должно быть. Спасибо. - person cartant; 06.07.2018