簡體   English   中英

多次登錄嘗試的Angular2 ngrx / store

[英]Angular2 ngrx/store with multiple login attempts

通過瀏覽幾個ngrx示例( https://github.com/SekibOmazic/ngrx-auth-example )和( https://github.com/ngrx/angular2-store-example ),他們都創建了對存儲,然后進行REST API調用。

我已經修改了它們的兩個代碼以返回錯誤,但是訂閱保持不變(例如,嘗試登錄時返回404)。 我可以在控制台中看到錯誤,但可以再次登錄。

在我的代碼中,我的設置幾乎相同,但是失敗的登錄響應會終止我的訂閱(據我所知)。

為了使4XX錯誤響應代碼不殺死我的訂閱,我需要什么魔術?

private actions$ = new BehaviorSubject<Action>({ type: actions.INIT, payload: null })

constructor(
  public http: Http,
  private store: Store<AppStore>
) {
  let logins = this.actions$
    .filter(action => { debug('ACTION', action); return action.type === actions.LOGIN_USER })
    .do(() => { debug('DISPATCH'); this.store.dispatch({ type: actions.LOGIN_REQUEST }) })
    .mergeMap(action => this.http.post('/auth/login', JSON.stringify(action.payload)))
    .share();

  let loginSuccess$ = logins
    .filter((payload: IResponse) => payload.data.token !== null)
    .map((payload: IResponse) => ({ type: actions.USER_AUTHENTICATED, payload: payload.data }));

  let loginFailure$ = logins
    .filter((payload: IResponse) => payload.data.token === null)
    .map((payload: IResponse) => ({ type: actions.LOGIN_FAILURE, payload: payload.data }));

  Observable
    .merge(loginSuccess$, loginFailure$)
    .subscribe((action: Action) => this.store.dispatch(action))
}

login(payload: ILogin) {
  this.actions$.next({ type: actions.LOGIN_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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM