Как гарантировать непрерывность наблюдаемого потока в случае ошибок http?

У меня возникла проблема с описанным ниже методом (onTrySignin), когда я столкнулся с ответом об ошибке HTTP. Блок catch сразу после моего вызова HTTP не позволяет Side Effect выдавать ошибку Action. если я делаю console.log, я получаю эту ошибку.

TypeError: вы указали «undefined» там, где ожидался поток. Вы можете предоставить Observable, Promise, Array или Iterable.

как я могу сохранить поток Observable и передать ответ следующему блоку (mergeMap), где я могу запустить другие Actions, (FailedSignin()) в этом случае?

onTrySignin = this.actions$
    .ofType(AuthActions.TRY_SIGNIN)
    .map((action: AuthActions.TrySignin) => {
       return action.payload;
      })
    .switchMap((action: DispatchAction) => {
      const trySignInPayload: TrySignInPayload = action.payload;
      return this.httpService.postRequest('Account/Login', (trySignInPayload.loginData))
        .catch((error: any) => {
          console.log(error)
          return Observable.empty();
        })
        .mergeMap((response: HttpResponse<any>) => {
          switch (response.status) {
            case 200:
              if (trySignInPayload.returnUrl) {
                this.router.navigate([trySignInPayload.returnUrl]);
              } else {
                this.router.navigate(['/dbapp']);
              }
              return Observable.concat(
                Observable.of(new AuthActions.GenerateAntiforgeryToken()),
                Observable.of(new AuthActions.Signin(fromAuth.authId, this.fetchUserData()))
              );
              case 401:
              case 404:
              return Observable.concat(
                Observable.of(new AuthActions.FailedSignin()),
                Observable.empty()
              );
            default:
            return Observable.concat(
              Observable.of(new AuthActions.FailedSignin()),
              Observable.empty()
            );
          }
        })
    }).catch((error) => {
      return Observable.throw(error);
    });

Это мой httpService

public postRequest(apiUrl: string, jsonData: {} = {}): Observable<any> {
        return this.httpService.post(this.baseUrl + apiUrl, JSON.stringify(jsonData),
        {observe: 'response', reportProgress: true, withCredentials: true});
    }

person JSON    schedule 02.02.2018    source источник


Ответы (1)


Вам нужно создать одноразовый поток, вот как мы это делаем:

@Effect()
  login$: Observable<Action> = this.actions$
   .ofType(authActions.LOGIN)
   .switchMap((action: any) => {
     // @Effect stream is completing when the error occurs, preventing any further 
     // actions. Therefore create a disposable stream to keep @Effect stream alive
     return Observable.of(action)
       .switchMap((action: any) => {
         return this.apiService.login(action.payload);
       })
       .map((x: any) => {
         return new authActions.SetTokensAction({ token: x.data.token });
       })
       .catch((error: any) => {
         return Observable.of(new authActions.LoginFailedAction(error));
       });
    });
person AJT82    schedule 03.02.2018