Странное поведение массива объектов при передаче в switchMap () в RXJS - PullRequest
0 голосов
/ 04 марта 2020

У меня есть простая цель - создать наблюдаемую систему, которая выдаст список всех стран мира. Тип наблюдаемой - Country[], т.е. значение хранилища вводится в виде массива объектов. Однако, когда он передан в switchMap, он волшебным образом преобразуется в тип Country. Я понятия не имею, что вызывает такое поведение, и если оно случайно не на моей стороне. Вот рассматриваемая функция:

public getAllCountries(): Observable<Country[]> {

      const getAppState = createFeatureSelector<ServicesState>('services');
      const getCountries = createSelector( getAppState, (state: ServicesState): Country[] => state.countries);
      // as you can see, this is the NGRX store slice that must be of type Observable<Country[]>
      const countriesFromStore$ = this.store.pipe(select(getCountries));

      return countriesFromStore$.pipe(
        // this is the switchMap that causes the error
        switchMap( countries => {
        // this is the return statement that somehow converts an array of objects into a single object??
        if (countries)  { return countries; }
        const countriesFromServer$: Observable<Country[]> = this.http.get<FilteredArrayResponse<Country>>
           (this.baseUrl, this.config.httpGetJsonOptions).pipe(
               tap( result => this.store.dispatch( new LoadCountriesAction(result.data)) ),
               map( result => result.data)
           );
        return countriesFromServer$; })
    );
  }

Если у вас есть вопросы:

  • FilteredArrayResponse - это обобщенный c интерфейс с атрибутом data, фактически содержащий массив
  • Полное сообщение об ошибке: Type 'Observable<Country | Country[]>' is not assignable to type 'Observable<Country[]>'.
  • Я предполагаю, что каким-то образом switchMap путает Observable of Arrays с Array of Observables ...
  • Тип возврата result.data всегда является массивом
  • Другие операторы из семейства map демонстрируют аналогичное поведение

1 Ответ

2 голосов
/ 04 марта 2020

Попробуйте вернуть of(countries) в switchMap (import { of } from 'rxjs';). Я думаю, что это должно исправить это. switchMap необходимо переключиться на Observable.

import { of } from 'rxjs';
...
switchMap((countries: Country[]) => {
  if (countries) {
    return of(countries);
  }
  ....
})
...