Angular2 ngrx/store具有多次登录尝试

Angular2 ngrx/store具有多次登录尝试,angular,rxjs,ngrx,Angular,Rxjs,Ngrx,在浏览几个ngrx示例()和()时,它们都创建了对存储的订阅,然后进行restapi调用 我修改了他们的两个代码以返回错误,但订阅仍然保持不变(例如,尝试登录时返回404)。我可以在控制台中看到错误,但我可以再次登录 在我的代码中,我有一个几乎相同的设置,但是一个失败的登录响应终止了我的订阅(据我所知) 我需要什么魔法才能使4XX错误响应代码不终止我的订阅 private actions$=new BehaviorSubject({type:actions.INIT,payload:null})

在浏览几个ngrx示例()和()时,它们都创建了对存储的订阅,然后进行restapi调用

我修改了他们的两个代码以返回错误,但订阅仍然保持不变(例如,尝试登录时返回404)。我可以在控制台中看到错误,但我可以再次登录

在我的代码中,我有一个几乎相同的设置,但是一个失败的登录响应终止了我的订阅(据我所知)

我需要什么魔法才能使4XX错误响应代码不终止我的订阅

private actions$=new BehaviorSubject({type:actions.INIT,payload:null})
建造师(
公共http:http,
私人商店
) {
让logins=this.actions$
.filter(action=>{debug('action',action);return action.type===actions.LOGIN\u USER})
.do(()=>{debug('DISPATCH');this.store.DISPATCH({type:actions.LOGIN_REQUEST})})
.mergeMap(action=>this.http.post('/auth/login',JSON.stringify(action.payload)))
.share();
让LoginSAccess$=登录
.filter((有效负载:IResponse)=>payload.data.token!==null)
.map((payload:ireresponse)=>({type:actions.USER_AUTHENTICATED,payload:payload.data}));
让loginFailure$=登录
.filter((有效负载:IResponse)=>payload.data.token==null)
.map((负载:IResponse)=>({type:actions.LOGIN_FAILURE,负载:payload.data}));
可观察
.merge(登录成功$,登录失败$)
.subscribe((操作:操作)=>this.store.dispatch(操作))
}
登录(有效负载:ILogin){
this.actions$.next({type:actions.LOGIN\u USER,payload});
}

这与RxJS本身有关,而不是与ngrx有关。错误将结束流,除非您a)在.subscribe(next,err)处理程序中处理它,或者使用.catch()运算符或类似的方法

比如说

let loginFailures$ = http.get('failurl')
  .map(res => res.json())
  //handle error with catch
  .catch(err => {
    //return a 'fixed' observable
    return Observable.of({ type: actions.LOGIN_FAILURE, payload: err })
  })
  .subscribe(action => store.dispatch(action));

这种方法有太多的缺点。请查看此链接:@StavAlfi-此链接不再是最新的。你能更新吗?当时,我在github问了同样的问题。