Как читать наблюдателей в MergeMap в сочетании с состоянием магазина? - PullRequest
1 голос
/ 05 ноября 2019

Я хочу обработать действие в действии, основываясь на последнем состоянии и выполнить некоторую логику. Есть несколько примеров, но у меня проблема с получением данных в MergeMap правильно.

@ ngrx / store 8.1.

@Injectable()
export class SitesEffects {

    constructor(
        private sitesService: SitesService,
        private actions$: Actions, 
        private store: Store<AppState>) {
    }


    getDataForSites$: Observable<Action> = createEffect(() =>
        this.actions$.pipe(
            ofType(LoadSites),
            map(action => action.siteIds), //siteIds is string[]
            withLatestFrom(siteIds => this.store.select(selectSites, new SiteIds(siteIds))), // items return from selector are Site[]
            mergeMap(([a,b]) => {
                // do some logic based on current state
                console.log(a);
                console.log(b);
                return of(SitesLoaded(new Sites([])));
            })

        )
    );
}

Я ожидаю, что 'a' это siteIds из первой функции карты (массив строк), а b это массив Site (Site [] from withLatestFrom) но b содержит ошибку в коде Visual Studio

Тип «Наблюдаемый» должен иметь метод «Symbol.iterator», который возвращает iterator.ts (2488)

а в консоли (средства разработки) есть ОШИБКА TypeError: undefined не является функцией (для строки mergeMap (([a, b]) =>

Как все эти функции должны быть выровнены для достижения того, что я ожидаюполучить в оператор mergeMap?

1 Ответ

0 голосов
/ 05 ноября 2019

используйте карту переключения / слияния вместо withLatestFrom

  switchMap(siteIds =>   this.store.select(selectSites, new SiteIds(siteIds))).pipe(first(), map(sites => [siteIds, sites])))

, вы получите фактическое состояние и идентификаторы. с первым оператором вы завершаете внутреннюю наблюдаемую первой эмиссией (последнее значение в вашем магазине)

...