Angular ngrx + Firebase OAuth 操作已调用但效果不

Posted

技术标签:

【中文标题】Angular ngrx + Firebase OAuth 操作已调用但效果不【英文标题】:Angular ngrx + Firebase OAuth action called but effect not 【发布时间】:2018-11-05 20:44:36 【问题描述】:

当我以这种效果注销时,我的 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看看是不是函数做错了,但是它根本没有被调用,而且我在GetUser 中有一个catch,但这也没有触发。

在这种情况下,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 数据库的连接存在问题

【问题讨论】:

您能否将运行测试场景时的调度操作日志添加到您的问题中? @ibenjelloun 已添加 您想要捕获的“获取用户”操作是否具有某种效果? @ibenjelloun “获取用户”操作是使用从 firebase 提供的数据从我的数据库加载用户的操作。但是这个动作的效果是不会调用的。只有具有默认值的操作 你能分享一下“获取用户”操作被调度时应该调用的效果代码吗? 【参考方案1】:

尝试使用这个:

@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 有一点区别。 如果你成功了,请告诉我。

【讨论】:

另外,这是关于排气映射和开关映射的一个很好的解释:***.com/questions/49698640/… 很遗憾,没有,完全没有效果。还是和以前一样。 您确定 loginWithGoogle 会返回一个承诺吗?你可以从 loginWithGoogle 作为 observable 返回并去掉 observable.fromPromise()。也许那里发生了一些阴暗的事情。如果您解决了问题,请告诉我如何解决。祝你好运【参考方案2】:

你可以试试这个吗?在我看来这可能会有所帮助。

  @Effect()
  googleLogin = this.actions.ofType(UserAction.GOOGLE_LOGIN).pipe(
    map(() => Observable.fromPromise(this.loginWithGoogle()),
    mergeMap(()=> return[type: UserActions.GET_USER])
  );

【讨论】:

这个根本不调用效果 @PsychoPflanze WATMAN,真的很奇怪【参考方案3】:

我遇到了类似的问题,我认为效果没有被调用,因为在您的 getUser 效果中,如果效果抛出任何错误,您没有实现 catch 块,所以理想情况下,如果效果得到错误并且它没有任何捕获机制,效果不会为进一步的操作调用。

【讨论】:

但是我在getUser 中有一个catch 函数,它没有被调用。 @Effect() getSearchData: Observable&lt;Action|any&gt; = this.actions .ofType() .map() .switchMap() .mergeMap(result =&gt; return []; ) .catch(e =&gt; Observable.of(new actions.ApiError(e))) ); 通常,这就是你如何构建我的效果以使它们多次调用,如果你再次将 catch 块放在外面,它将不适用于多个操作。 我的getUser 效果就是这样构建的,但它在某种程度上与signInWithPopup 中断了 奇怪,@PsychoPflanze 现在修复了吗,你还面临同样的问题吗? 不,它仍然不起作用。我正在考虑制作自己的后端

以上是关于Angular ngrx + Firebase OAuth 操作已调用但效果不的主要内容,如果未能解决你的问题,请参考以下文章

Angular 7、Ngrx、Rxjs 6 - 访问延迟加载模块之间的状态

ngrx/store@6.1.0 在升级到 Angular 7 时需要 @angular/core@^6.0.0 的对等体

我可以在 angular + ngrx 中使用对象扩展语法吗?

将 ngrx/Store 集成到现有的 Angular 项目中

使用 createReducer 函数时为生产构建 angular+ngrx 8 时出错

在单元测试中使用参数模拟 ngrx 存储选择器(Angular)