Angular 6 / RxJs 6可观察到的合并也会跳过错误块

时间:2018-09-04 06:54:14

标签: angular rxjs rxjs6

我的身份验证服务中具有登录功能,如果登录完成或返回HttpError,我希望它返回一些值。但是,这一步很容易,我还想包括一下如果初始登录有效,则使用第二个可观察值加载帐户详细信息。此步骤不适用于我,因为如果登录失败,该代码也不应尝试加载帐户详细信息。我尝试使用合并功能,但是当发生错误时,它仍会调用其他可观察到的功能。同样,即使登录有效,我仍然从第二个可观察到的位置也不会延迟。

我很难适应Rxjs版本6的管道设置,并且拥有如此多的管道非常令人困惑。

登录方法:

    public Login(LoginData: LoginModel): Observable<HttpErrorResponse | LoginResponse>
  {
    var loginRequest = this.web.post<LoginResponse>('http://localhost:20552/api/token', LoginData).pipe(share());

    return loginRequest.pipe(map((success: LoginResponse) =>
    {
      return new LoginResponse(success.token);
    }), merge(this.LoadAccountDetails())).pipe(catchError((val: LoginResponse | HttpErrorResponse) => of(val))).pipe(map((x: LoginResponse | HttpErrorResponse) =>
    {
      if (x instanceof LoginResponse)
      {
        return new LoginResponse(x.token);
      } else
      { 
        var error = x as HttpErrorResponse;
        return error;
      }
    }));
  }


  public LoadAccountDetails(): Observable<any>
  { 
    return of({}).pipe(delay(5000)); // Simple delay function because I haven't finished this server code yet.
  }

1 个答案:

答案 0 :(得分:0)

这取决于错误是以next还是error通知的形式发出,但是从此示例中很难分辨出来。

问题还可能是您可能想要使用mergeMap而不是merge,因为merge在创建链时会立即订阅,通常这不是您想要的。

如果您使用mergeMap(() => this.LoadAccountDetails()),则仅当其来源发出next值时,它才会调用回调。