2017-03-10 18 views
0

我派遣一个动作,当表单提交,那么则达到checkPasswdNGRX:错误回调没有达到

public checkPasswd():void { 
    this.store$.dispatch({ type: 'USER_REDUCER_USER_LOGIN', payload: { username: this.form.value.mail, password: this.form.value.passwd } }); 
} 

ngOnInit - constructor我创建这个订阅Store<IStore>

private user$: Observable<IUser>; 
private userSub: Subscription; 

constructor(private store$: Store<IStore>) 
{ 
    this.user$ = this.store$.select(state => state.user).filter(user => user.id != null); 
} 

ngOnInit():void { 
    this.userSub = this.user$.subscribe(
     (user: IUser) => { 
      this.router.navigate(['/app']); (((2))) 
     }, 
     (error: any) => { 
      this.addAlert(error.message); (((1))) 
     } 
    ); 
} 

我在检查发现错误时已达到(((1)))。尽管如此,当出现错误时它从未达到过。

我使用efffects:

@Effect({ dispatch: true }) 
userLogin$: Observable<Action> = this._actions$ 
    .ofType('USER_REDUCER_USER_LOGIN') 
    .switchMap((action: Action) => 
     this._userService.checkPasswd(action.payload.username, action.payload.password) 
     .map((user: any) => { 
      return { type: 'USER_REDUCER_USER_LOGIN_SUCCESS', payload: user }; 
     }) 
     .catch((err) => { 
      return Observable.of({ type: 'USER_REDUCER_USER_LOGIN_FAILED', payload: { error: err } }); 
     }) 
); 

正如你所看到的,在我的影响,我想打电话给我的服务,如果它得到我返回Observable.of({ type: 'USER_REDUCER_USER_LOGIN_FAILED', payload: { error: err } });错误。

所以,在这之后,该减速器被调用,达到:

public static USER_LOGIN_FAILED = `${UserReducer.reducerName}_USER_LOGIN_FAILED`; 
    private static userLoginFailed(sourcesRdx, type, payload) { 
     return Object.assign(<IUser>{}, sourcesRdx, payload); 
    } 

然而,没有达到(((1))),既不(((2)))。所以,调用堆栈似乎没有达到我的订阅...

任何想法?

+0

背后有什么'this.user $'? – olsn

+0

对不起,我编辑了这篇文章。但是,'构造函数(private store $:Store ){this.user $ = this.store $ .select(state => state.user).filter(user => user.id!= null); }'。 ' – Jordi

回答

1

第一个:您的选择过滤掉任何不包含用户标识的发射,我假设登录失败时会出现这种情况 - 这意味着绝对没有数据会在此点之外发射,除非存在在商店中有ID的有效用户。

this.user$ = this.store$.select(state => state.user).filter(user => user.id != null); 

:本store.select永远不会发出任何错误,因为它是一个永久的流 - 如果那里发出的错误,这样会破坏流(这是对RxJS核心原则之一:错误将停止并最终确定一个流)。

所以这种行为似乎是我期待的。


如何处理? - 如果你想要在你的ngrx-store中保存错误,那么你必须为它实现一个字段,并添加一个select来获得错误并显示它们 - 如果你不想通过商店,你可以添加一个错误警报处理程序直接生效。

也有看NGRX,例如,应用程序的最佳实践:https://github.com/ngrx/example-app

+0

非常感谢@olsn。据我所知,一个'错误回调'不应该永远不会在上次订阅时设置('LoginComponent - this.user $'),不是吗?另一方面,你直接用''error-alert-handler'直接产生的结果是什么意思?我可以使用这种策略填充错误吗? – Jordi

+0

我的意思是:如果你想向你的用户显示错误,你可以通过'.catch(err => this.myErrorAlertService.show(err))'来实现 - 或者你发送给商店并且有一些组件订阅了一些error-msg-array(或者你保存了存储中的错误)并在那里显示错误。 - 如果您不打算显示通知 - 实际上并不需要所有这些 - 只需捕获错误并返回一个空对象(基本上无需执行任何操作即可结束效果) – olsn

+0

再次感谢。您最喜欢哪种方式:1.使用ErrorAlertService或2.使用Store.errors订阅。 – Jordi

相关问题