Я работаю над попыткой очистить сложную цепочку наблюдаемых.Я перебираю массив предметов, возвращенных из моего магазина Акиты, и выполняю действия с каждым предметом, а затем сохраняю их, если они были изменены.В настоящее время у меня есть работающее решение, но мне было интересно, есть ли более чистый или более прямой способ обработки этой цепочки.
Я попытался найти некоторые примеры циклического прохождения массива с помощью наблюдаемых, но ничего не нашелсложный или пытающийся сделать что-то похожее на меня.
Пример, приведенный ниже, работает, просто он не выглядит как лучшая практика для наблюдаемых и операторов.
public fetchAdditionalSavedSearchDetails(): Observable<any> {
return this.savedSearchQuery.selectAll().pipe(
// Debounce to prevent from calling to frequently
debounceTime(500),
switchMap((savedSearches) => {
return forkJoin(
// Loop through saved searches and return observable
savedSearches.map((savedSearch) => of(savedSearch).pipe(
// default modified to false
switchMap((savedSearch) => of([savedSearch, false])),
switchMap(([savedSearch, modified]) => {
const search: ISavedSearch = savedSearch as ISavedSearch;
if (search.searchTotalCount === undefined) {
// todo: implement fetching search count
return of([{ ...search, searchTotalCount: 0 }, true]);
}
return of([savedSearch, modified]);
}),
switchMap(([savedSearch, modified]) => {
const search: ISavedSearch = savedSearch as ISavedSearch;
if (search.scheduledExports === undefined) {
return this.scheduledExportService.fetchAllScheduledExportsForSavedSearch(search).pipe(
mergeMap((scheduledExports) => of([{ ...search, scheduledExports }, true]))
);
}
return of([savedSearch, modified]);
})
))
).pipe(tap((response) => {
// Prevent akita store from triggering changes on each update of entity
applyTransaction(() => {
response.forEach((searchResp: Array<ISavedSearch | boolean>) => {
const search: ISavedSearch = searchResp[0] as ISavedSearch;
const modified: boolean = searchResp[1] as boolean;
if (modified) {
this.savedSearchStore.update(search.id, search);
}
});
});
}));
})
);
}