Честно говоря, я полный нуб в NGRX и имею ограниченный опыт работы с rxjs. Но по сути у меня есть код, похожий на этот:
@Effect()
applyFilters = this.actions$.pipe(
ofType<ApplyFilters>(MarketplaceActions.ApplyFilters),
withLatestFrom(this.marketplaceStore.select(appliedFilters),
this.marketplaceStore.select(catalogCourses)),
withLatestFrom(([action, filters, courses]) => {
return [courses,
this.combineFilters([
this.getCourseIdsFromFiltersByFilterType(filters, CatalogFilterType.TRAINING_TYPE),
this.getCourseIdsFromFiltersByFilterType(filters, CatalogFilterType.INDUSTRIES)
])
];
}),
map(([courses, filters]) => {
console.log('[applyFilters effect] currently applied filters =>', filters);
console.log('courseFilters', filters);
const filteredCourses = (courses as ShareableCourse[]).filter(x => (filters as number[]).includes(+x.id));
console.log('all', courses);
console.log('filtered', filteredCourses);
return new SetCatalogCourses(filteredCourses);
})
);
Вспомогательный метод:
private combineFilters(observables: Observable<number[]>[]): number[] {
if (!observables.some(x => x)) {
return [];
} else {
let collection$ = (observables[0]);
const result: number[] = [];
for (let i = 0; i < observables.length; i++) {
if (i >= 1) {
collection$ = concat(collection$, observables[i]) as Observable<number[]>;
}
}
collection$.subscribe((x: number[]) => x.forEach(y => result.push(y)));
return result;
}
}
Таким образом, объекты хранилища заполняются, я могу их получить. Я знаю, что наблюдаемые «this.getCourseIdsFromFiltersByFilterType (args)» работают так, как в журнале консоли «фильтров», которые они есть. Но время операции неправильное. Я читал и просто потерялся после того, как попробовал SwitchMap, MergeMap, Fork. Кажется, все выглядит хорошо, но когда я пытаюсь фактически просмотреть коллекции для результата наблюдаемых из службы, они еще не реализованы. Я готов попробовать что угодно, но в простейшей форме проблема такова:
Две наблюдаемые должны вызываться либо в одинаковом порядке, либо довольно близко. Их «результаты» имеют тип number[]. Сложная коллекция классов со свойством 'id', которое должно быть включено в это число []. Это прекрасно работает, когда все результаты не являются асинхронными или компонентными. (Я фиктивил статические значения с помощью переменных, чтобы проверить мой «фильтр», а затем «включает» логику, и это работает). метод возврата, и я просто недостаточно хорош в rxjs, чтобы сформулировать способ сделать его счастливым и обеспечить полную реализацию наблюдаемых для их значений из сервисов для надлежащего использования. Опять же, я вижу, что мой консольный журнал «фильтров» существует. Тем не менее, когда я делаю «длину», она всегда равна нулю, поэтому я знаю, что где-то есть проблема с синхронизацией. Любая помощь горячо приветствуется.
getCourseIdsFromFiltersByFilterType
методом, который вызывает какую-то, возможно, удаленную службу, которая возвращаетObservable<number[]>
of courseIds? Если. предыдущее верно, вы хотите объединить результаты двух сделанных вами вызовов? - person Picci   schedule 03.04.2020