2

いくつかの 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 });
}
4

1 に答える 1