NGXS - предоставлен неверный объект при возврате (любого) в switchMap - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть действие, которое получает пользователь firebase от authState.Если пользователь существует, то код возвращает документ, связанный с пользователем.Если нет, то будет возвращено of(null):

класс AuthState

ngxsOnInit({dispatch}: StateContext<AuthStateModel>) {
  dispatch(SyncAuth);
}

@Action(SyncAuth)
syncAuth({dispatch}: StateContext<AuthStateModel>) {
  return this.afAuth.authState.pipe(
    switchMap(fireAuth => fireAuth ? this.authService.auth$(fireAuth.uid) : of(null)),
    tap(user => dispatch(new PatchUserData(user)))
  );
}

класс AuthService

auth$(userId: string): Observable<User> {
  if (!userId) {
    return of(null);
  }

  return this.db.doc$(`users/${userId}`).pipe(
    map(user => user ? this.transform({...user, id: userId}) : null),
    shareReplay(1)
  );
}

Выглядит просто, верно?Ну, это не сработает, если ваш плагин Redux Devtools не включен (Да, я знаю, что это странно).

Когда я хочу вернуть наблюдаемое со значением любого типа (например, число, строка,null или даже undefined) внутри оператора switchMap я получаю следующую ошибку:

Uncaught TypeError: Вы указали недопустимый объект, где ожидался поток.Вы можете предоставить Observable, Promise, Array или Iterable.(zone.js: 192)

at subscribeTo (subscribeTo.js:41)
at subscribeToResult (subscribeToResult.js:6)
at SwitchMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/switchMap.js.SwitchMapSubscriber._innerSub (switchMap.js:47)
at SwitchMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/switchMap.js.SwitchMapSubscriber._next (switchMap.js:40)
at SwitchMapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
at angularfire2.js:49
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:388)
at Object.onInvoke (core.js:3820)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:387)
at Zone.push../node_modules/zone.js/dist/zone.js.Zone.run (zone.js:138)

Проблемная строка в моем AuthState классе:

// fireAuth === null
switchMap(fireAuth => fireAuth ? this.authService.auth$(fireAuth.uid) : of(null)),

Но, если я удалю оператор of ивернуть результат authService.auth$ наблюдаемый (который возвращает of(null), тогда ошибка исчезнет:

1 Ответ

0 голосов
/ 27 сентября 2018

Иногда мы очень доверяем нашим IDE.Иногда мы не должны.Моя IDE импортировала оператора следующим образом:

import { of } from 'rxjs/internals/operators';

вместо

import { of } from 'rxjs';
...