代码之家  ›  专栏  ›  技术社区  ›  Bailey Miller

角度6/RXJS 6可观测合并,也跳到错误块

  •  1
  • Bailey Miller  · 技术社区  · 7 年前

    我的身份验证服务中有一个登录函数,如果登录完成或返回httperror,我希望它返回一些值。不过,这一步很简单,如果初始登录成功的话,我还想包括使用第二个可观察的加载帐户详细信息。这个步骤对我不起作用,因为如果登录失败,代码也不应该尝试加载帐户详细信息。我尝试使用merge函数,但是当出现错误时,它仍然调用另一个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.
      }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   martin    7 年前

    它取决于错误是否以 next error 但是很难从这个例子中分辨出来。

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

    如果你使用 mergeMap(() => this.LoadAccountDetails()) 只有当其源发出 下一个 价值。

    推荐文章