rxjs zip два switchMap?
У меня есть определено поведение Subject:
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;
});
так как это сделать? любая помощь ценится
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
, за исключением случаев, когда запросы могут выдавать более одного результата, и гарантируется, что каждый раз, когда один запрос отправляет результат, другой запрос также отправляет один.