Действие Angular ngrx + Firebase OAuth вызвано, но эффекта нет - PullRequest
0 голосов
/ 26 мая 2018

У меня проблема с настройкой oauth, когда я выхожу из системы с таким эффектом:

@Effect()
  logout:  Observable<Action> = this.actions.ofType(UserActions.LOGOUT)
    .switchMap(() => Observable.of(this.afAuth.auth.signOut()))
    .map(() => new UserActions.GetUser())
    .catch(err => Observable.of(new UserActions.AuthError({error: err.message})));

Все работает нормально, и вызывается UserActions.GetUser().Теперь, если я попытаюсь войти в систему с помощью этого эффекта и этой функции аутентификации firebase:

@Effect()
  googleLogin: Observable<Action> = this.actions.ofType(UserActions.GOOGLE_LOGIN)
    .switchMap(() => Observable.fromPromise(this.loginWithGoogle()))
    .map(() => new UserActions.GetUser())
    .catch(err => Observable.of(new UserActions.AuthError({error: err.message})));

private loginWithGoogle() {
  return this.afAuth.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider());
}

Вызывается новый UserActions.GetUser(), и я вижу его в Redux DevTools, но фактический эффект не вызывается,я положил туда много console.log, чтобы посмотреть, сделал ли я что-то не так в функции, но она вообще не вызывается, и у меня есть catch в GetUser, но это тоже не срабатывает.

Есть ли какая-то проблема с firebase в этом случае, или я тупой?

Действия:

Dispatched Actions

Получить пользователяЭффект:

@Effect()
  getUser: Observable<Action> = this.actions.ofType(UserActions.GET_USER)
    .switchMap(() => {
      console.log('test'); // <-- Not called
      return this.afAuth.authState;
    })
    .map(()=> {
      return new UserActions.Authenticated();
    });

** РЕДАКТИРОВАТЬ 1

Я сделал новое наблюдение: когда больше нет подключения к Интернету, так что база данных загружается из локальной сети, это на самом деле работает, как-то есть проблема с подключением к базе данных firebase

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

вы можете попробовать это?Это может помочь, на мой взгляд.

  @Effect()
  googleLogin = this.actions.ofType(UserAction.GOOGLE_LOGIN).pipe(
    map(() => Observable.fromPromise(this.loginWithGoogle()),
    mergeMap(()=> return[{type: UserActions.GET_USER}])
  );
0 голосов
/ 06 июня 2018

Я столкнулся с подобной проблемой, я думаю, что эффект не вызывается, потому что в вашем getUser эффекте вы не реализуете блок catch, если эффект генерирует какую-либо ошибку, поэтому в идеале в этом случае, если эффект получаетошибка и не имеет никакого механизма захвата, который не будет вызывать эффект для дальнейших действий.

0 голосов
/ 30 мая 2018

попробуйте использовать это:

@Effect()
googleLogin: Observable<Action> = this.actions.pipe(

        ofType(UserActions.GOOGLE_LOGIN),
        map(action => action.payload), // if there is no payload disregard this
        exhaustMap((auth: any) => Observable.fromPromise(this.loginWithGoogle()
               .pipe(
                  map(() => new UserActions.GetUser()),
                  catchError(err => Observable.of(new UserActions.AuthError({error: err.message})))
            ))
        )

    )

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

...