Попытка выяснить чистый способ выполнения действий с каждым элементом массива с использованием наблюдаемых - PullRequest
1 голос
/ 29 марта 2019

Я работаю над попыткой очистить сложную цепочку наблюдаемых.Я перебираю массив предметов, возвращенных из моего магазина Акиты, и выполняю действия с каждым предметом, а затем сохраняю их, если они были изменены.В настоящее время у меня есть работающее решение, но мне было интересно, есть ли более чистый или более прямой способ обработки этой цепочки.

Я попытался найти некоторые примеры циклического прохождения массива с помощью наблюдаемых, но ничего не нашелсложный или пытающийся сделать что-то похожее на меня.

Пример, приведенный ниже, работает, просто он не выглядит как лучшая практика для наблюдаемых и операторов.

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

1 Ответ

0 голосов
/ 29 марта 2019

Я не прочитал весь код, но из того, что вы спрашиваете, я думаю, вам может помочь следующее изменение.

Вы можете изменить этот код:

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событие с одним значением.

В общем, это признак того, что вы делаете что-то не так, когда вам приходится делать трубы внутри других каналов (есть исключения из этого).

...