Angular 在http错误的情况下,如何保证可观察流的连续性?

Angular 在http错误的情况下,如何保证可观察流的连续性?,angular,observable,rxjs5,ngrx,ngrx-effects,Angular,Observable,Rxjs5,Ngrx,Ngrx Effects,当我遇到HTTP错误响应时,以下方法(onTrySignin)有问题。调用HTTP之后的catch块可防止副作用引发操作错误。如果我执行console.log操作,则会出现此错误 TypeError:您在需要流的位置提供了“undefined”。您可以提供一个可观察的、承诺的、数组的或可观察的 在这种情况下,如何保留可观察的流并将响应传递到下一个块(mergeMap),在该块中我可以触发其他操作(FailedSignin()) onTrySignin = this.actions$ .o

当我遇到
HTTP
错误响应时,以下方法(
onTrySignin
)有问题。调用
HTTP
之后的
catch
块可防止
副作用
引发
操作
错误。如果我执行
console.log
操作,则会出现此错误

TypeError:您在需要流的位置提供了“undefined”。您可以提供一个可观察的、承诺的、数组的或可观察的

在这种情况下,如何保留可观察的
流并将响应传递到下一个块(
mergeMap
),在该块中我可以触发其他
操作(
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);
    });

您需要创建一个一次性流,我们就是这样做的:

@Effect()
login$:Observable=this.actions$
.of类型(authoctions.LOGIN)
.switchMap((操作:任意)=>{
//@Effect-stream在错误发生时正在完成,防止任何进一步的错误
//因此,创建一个一次性流来保持@Effect流的活动
可观察的回报(行动)
.switchMap((操作:任意)=>{
返回此.apiService.login(action.payload);
})
.map((x:any)=>{
返回新的authActions.SetTokensAction({token:x.data.token});
})
.catch((错误:任意)=>{
返回可观察的(新authActions.LoginFailedAction(error));
});
});
public postRequest(apiUrl: string, jsonData: {} = {}): Observable<any> {
        return this.httpService.post(this.baseUrl + apiUrl, JSON.stringify(jsonData),
        {observe: 'response', reportProgress: true, withCredentials: true});
    }