【问题标题】:Angular 6 / RxJs 6 Observable merging that also skips to error blockAngular 6 / RxJs 6 Observable 合并也跳到错误块
【发布时间】:2018-09-04 15:38:45
【问题描述】:

我的身份验证服务中有一个登录功能,如果登录完成或返回 HttpError,我希望它返回一些值。但是,这一步很简单,如果初始登录有效,我还想包括使用第二个 observable 加载帐户详细信息。这一步对我不起作用,因为如果登录失败,代码也不应该尝试加载帐户详细信息。我尝试使用合并功能,但是当发生错误时,它仍然调用另一个可观察的。此外,即使登录成功,我仍然不会从第二个 observable 中得到延迟。

我很难适应 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.
  }

【问题讨论】:

    标签: angular rxjs rxjs6


    【解决方案1】:

    这取决于错误是作为next 还是error 通知发出的,但从这个例子中很难分辨。

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

    如果您使用mergeMap(() =&gt; this.LoadAccountDetails()),它只会在其源发出next 值时调用回调。

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 1970-01-01
      • 2018-11-06
      • 2018-11-09
      • 2018-10-15
      • 2019-02-21
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多