Если я понимаю проблему, вы можете попытаться заменить это
withLatestFrom(([action, filters, courses]) => {
return [courses,
this.combineFilters([
this.getCourseIdsFromFiltersByFilterType(filters, CatalogFilterType.TRAINING_TYPE),
this.getCourseIdsFromFiltersByFilterType(filters, CatalogFilterType.INDUSTRIES)
])
];
}),
чем-то вроде этого
switchMap(([action, filters, courses]) => {
return forkJoin(
this.getCourseIdsFromFiltersByFilterType(filters, CatalogFilterType.TRAINING_TYPE),
this.getCourseIdsFromFiltersByFilterType(filters, CatalogFilterType.INDUSTRIES
).pipe(
map(([trainingFilters, industryFilters]) => {
return [courses, [...trainingFilters, ...industryFilters]]
})
}),
Теперь некоторые пояснения.
Когда вы выходите из этого
withLatestFrom(this.marketplaceStore.select(appliedFilters),
this.marketplaceStore.select(catalogCourses)),
вы передаете следующему оператору этот массив [action, filters, courses]
.
Следующий оператор должен вызвать некоторые удаленные API и, следовательно, должен создать новый Observable. Таким образом, вы находитесь в ситуации, когда вышестоящая Наблюдательная система уведомляет что-то, что принимается оператором, который создает новую Наблюдаемую . Аналогичные ситуации, когда необходимо использовать такие операторы, как switchMap
, mergeMap
(он же flatMap
), concatMap
и exhastMap
. Такие операторы сглаживают внутреннюю наблюдаемую и возвращают ее результат. Это причина, почему я бы использовал один из этих операторов сплющивания. Почему switchMap
в вашем случае? Это не совсем короткая история. Возможно, чтение этого может пролить свет.
Теперь давайте посмотрим на функцию, переданную switchMap
return forkJoin(
this.getCourseIdsFromFiltersByFilterType(filters, CatalogFilterType.TRAINING_TYPE),
this.getCourseIdsFromFiltersByFilterType(filters, CatalogFilterType.INDUSTRIES
).pipe(
map(([trainingFilters, industryFilters]) => {
return [courses, [...trainingFilters, ...industryFilters]]
})
Эта функция сначала выполняет 2 удаленных вызова API параллельно через forkJoin
, затем возьмите результат этих 2 вызовов и сопоставьте его с новым массивом, содержащим как courses
, так и объединение trainingFilters
и industryFilters