1

我正在努力清理复杂的可观察对象链。我正在遍历从我的秋田商店返回的一系列项目并对每个项目执行操作,然后如果它们已被修改则存储它们。我目前有一个可行的解决方案,但我想知道是否有更清洁或更直接的方法来处理这个链。

我尝试查找一些使用可观察对象循环遍历数组的示例,但没有发现任何复杂的东西或尝试做与我类似的事情。

下面的示例有效,但它似乎不是可观察对象和运算符的最佳实践。

    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);
                            }
                        });
                    });
                }));
            })
        );
    }
4

1 回答 1

0

我没有通读所有代码,但根据您的要求,我认为以下更改可能会对您有所帮助。

您可以更改此代码:

switchMap((savedSearches) => {
    return forkJoin(
        // Loop through saved searches and return observable
        savedSearches.map((savedSearch) => of(savedSearch).pipe(

对此:

switchMap(savedSearches => savedSearches),
// Continue with your next operator here

那应该是这样的:

  • 进来:一个包含 5 个项目的事件。
  • 外出:5 个事件,单个值。

一般来说,当你必须在其他管道内做管道时,这表明你做错了(这有例外)。

于 2019-03-29T18:42:06.230 回答