NgRx效果,发生一个失败,不接受新动作

devteam6
@Injectable()
export class UserEffects {
  constructor(
    private store$: Store<fromRoot.State>,
    private actions$: Actions,
    private router: Router,
    private chatService: ChatService,
    private authService: AuthService,
    private db: AngularFireAuth,
    private http: HttpClient
  ) { }

  @Effect()
  login$: Observable<Action> = this.actions$.pipe(
    ofType(UserActions.LOGIN),
    switchMap((action: UserActions.LoginAction) =>
      from(this.db.auth.signInWithEmailAndPassword(action.payload.email, action.payload.password)),
    ),
    // switchMapTo(from(this.db.auth.currentUser.getIdToken())),
    switchMapTo(from(this.db.authState.pipe(
      take(1),
      switchMap((user)=>{
        if (user)
          return from(user.getIdToken());
        else
          return of(null);
      })
    ))),
    switchMap(token => this.http.post(environment.apiUrl + '/api/login', { token: token })),
    tap((response: any) => {
      if (response.valid === 'true') {

        localStorage.setItem('token', response.token);

        this.router.navigate(['dash']);

      }
    }),
    map(response => new UserActions.LoginSuccessAction({ response })),
    catchError(error => {
      return of({
        type: UserActions.LOGIN_FAILURE,
        payload: error
      });
    })
  );

  @Effect({ dispatch: false })
  loginSuccess$: Observable<Action> = this.actions$.pipe(
    ofType(UserActions.LOGIN_SUCCESS),
    tap((action: UserActions.LoginSuccessAction) => {
      console.log("LOGIN_SUCCESS");
      console.log(action);
    }));

    @Effect({ dispatch: false })
    loginFailure$: Observable<Action> = this.actions$.pipe(
      ofType(UserActions.LOGIN_FAILURE),
      tap((action: UserActions.LoginFailureAction)=>{
        console.log("LOGIN_FAILURE");
        console.log(action.payload.code);
      }));
}

用例:您位于登录页面。您输入用户名和密码以调用LoginAction。如果一切顺利,则应调用LoginSuccessAction。否则,应调用LoginFailureAction。

除一种情况外,其他所有方法都起作用:
一旦调用LoginFailureAction,将不会再次调用LoginSuccessAction和LoginFailureAction。我不知道为什么会这样。我认为这可能与这条线有关:

catchError(error => {
  return of({
    type: UserActions.LOGIN_FAILURE,
    payload: error
  });
})

但是我在这里迷路了。我不是反应式编程方面的专家,但是除了这一种情况外,它都能按预期工作。有谁知道为什么会这样?

萨坦时间

效果尊重成功的完成和错误。如果发生错误,则ngrx将重新订阅,如果成功完成,则将不再订阅。

例如,catchError可能会导致这种情况,因为它不侦听其父流。如果要在发生错误的情况下启用流,则需要在之后使用repeat运算符catchError

    catchError(error => {
      return of({
        type: UserActions.LOGIN_FAILURE,
        payload: error
      });
    }),
    repeat(), // <- now effect is stable.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

角度ngrx存储将多http服务调用成一个效果并消除动作

来自分类Dev

一个包含实数的参数,Linux上不接受

来自分类Dev

为什么我们在Rails的新动作下声明一个@page = Page.new?

来自分类Dev

从一个效果分派多个动作

来自分类Dev

创建一个接受对象但不接受数组的通用函数

来自分类Dev

测试失败动作-大理石-NGRX效果

来自分类Dev

使用类型参数时,Scala“不接受任何类型参数,应该是:一个”

来自分类Dev

PHP括号较少的IF条件不接受一个以上的语句

来自分类Dev

扩展方法不接受省略第一个参数

来自分类Dev

错误:“ activate不接受一个以上的参数:”(在使用condo激活env时)

来自分类Dev

为什么线性回归不接受系列数据作为第一个参数?

来自分类Dev

关于Malloc行为的困惑,为什么不接受最后一个输入?

来自分类Dev

试图重建一个较旧的VB库。包括但不接受依赖项

来自分类Dev

根据对另一个不接受数值的下拉列表的选择来填充下拉列表

来自分类Dev

Scala Seq 的 filterNot 实现不接受另一个 List 作为函数输入参数

来自分类Dev

链表不接受下一个元素(C 语言)

来自分类Dev

React Navigation安装一个屏幕,然后不接受从另一个屏幕再次传递的新参数

来自分类Dev

类型不接受任何一个或两个属性之一,但同时拒绝两个属性

来自分类Dev

如何使用 getopts 不接受任何东西,一个标志,一个带参数的标志和一个带两个参数的标志

来自分类Dev

翻译者,只接受一个字,为什么不接受其余一个字

来自分类Dev

通过另一个switchMap和filter传递效果给switchMap的动作值?

来自分类Dev

效果“AuthEffects.register$”调度了一个无效的动作

来自分类Dev

动作必须有一个类型属性错误 NgRx

来自分类Dev

angular 和 ngrx :你能在循环中调度一个动作吗?

来自分类Dev

Material-UI:Select组件不接受Fragment作为子级。考虑改为提供一个数组

来自分类Dev

禁用提交btn时,预填充的表单输入元素不接受第一个输入

来自分类Dev

如何创建一个不接受在输入对话框中输入的特定数量的数字的异常?

来自分类Dev

我正在尝试制作一个显示数值平均值的 ggplot,但 R 不接受它们作为数字

来自分类Dev

在ReactJS中,由于发生另一个动作,我如何/在何处触发执行异步获取的动作?

Related 相关文章

  1. 1

    角度ngrx存储将多http服务调用成一个效果并消除动作

  2. 2

    一个包含实数的参数,Linux上不接受

  3. 3

    为什么我们在Rails的新动作下声明一个@page = Page.new?

  4. 4

    从一个效果分派多个动作

  5. 5

    创建一个接受对象但不接受数组的通用函数

  6. 6

    测试失败动作-大理石-NGRX效果

  7. 7

    使用类型参数时,Scala“不接受任何类型参数,应该是:一个”

  8. 8

    PHP括号较少的IF条件不接受一个以上的语句

  9. 9

    扩展方法不接受省略第一个参数

  10. 10

    错误:“ activate不接受一个以上的参数:”(在使用condo激活env时)

  11. 11

    为什么线性回归不接受系列数据作为第一个参数?

  12. 12

    关于Malloc行为的困惑,为什么不接受最后一个输入?

  13. 13

    试图重建一个较旧的VB库。包括但不接受依赖项

  14. 14

    根据对另一个不接受数值的下拉列表的选择来填充下拉列表

  15. 15

    Scala Seq 的 filterNot 实现不接受另一个 List 作为函数输入参数

  16. 16

    链表不接受下一个元素(C 语言)

  17. 17

    React Navigation安装一个屏幕,然后不接受从另一个屏幕再次传递的新参数

  18. 18

    类型不接受任何一个或两个属性之一,但同时拒绝两个属性

  19. 19

    如何使用 getopts 不接受任何东西,一个标志,一个带参数的标志和一个带两个参数的标志

  20. 20

    翻译者,只接受一个字,为什么不接受其余一个字

  21. 21

    通过另一个switchMap和filter传递效果给switchMap的动作值?

  22. 22

    效果“AuthEffects.register$”调度了一个无效的动作

  23. 23

    动作必须有一个类型属性错误 NgRx

  24. 24

    angular 和 ngrx :你能在循环中调度一个动作吗?

  25. 25

    Material-UI:Select组件不接受Fragment作为子级。考虑改为提供一个数组

  26. 26

    禁用提交btn时,预填充的表单输入元素不接受第一个输入

  27. 27

    如何创建一个不接受在输入对话框中输入的特定数量的数字的异常?

  28. 28

    我正在尝试制作一个显示数值平均值的 ggplot,但 R 不接受它们作为数字

  29. 29

    在ReactJS中,由于发生另一个动作,我如何/在何处触发执行异步获取的动作?

热门标签

归档