当我使用此效果注销时,我的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 auth函数登录:
@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,看看我是否在函数中做错了,但它根本没有被调用,而且我在GetUser中有一个捕获,但这也没有触发.
在这种情况下是否存在firebase的问题或者我是愚蠢的?
操作:
@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从本地加载,它实际上工作,不知何故连接到firebase数据库的问题
解决方法
尝试使用这个:
@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}))) )) ) )
为此,exhaustMap和switchMap之间有一点区别.如果你成功的话,请告诉我.