petajamaja
petajamaja

Reputation: 530

Strange behaviour of an array of objects when passed into switchMap() in RXJS

I have a simple goal of creating an observable that emits a list of all the countries in the world. The type of the observable is Country[], i.e. the store value is typed as an array of objects. However, when passed to switchMap, it magically gets converted into type Country. I have no idea what causes this behavior and if it is not, by chance, on my side. Here is the function in question:

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

In case you have questions :

Upvotes: 0

Views: 1133

Answers (1)

AliF50
AliF50

Reputation: 18809

Try returning of(countries) in the switchMap (import { of } from 'rxjs';). I think that should fix it. The switchMap needs to switch to an Observable.

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

Upvotes: 5

Related Questions