Angular 6 / RxJs 6 Observable 合并也跳到错误块
Angular 6 / RxJs 6 Observable merging that also skips to error block
我的身份验证服务中有一个登录功能,如果登录完成或 return HttpError,我希望它 return 具有一些值。然而,这一步很简单,如果初始登录有效,我还想包括使用第二个 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.
}
这取决于错误是作为 next
还是 error
通知发出,但很难从这个例子中分辨出来。
另外,问题可能是您可能想使用 mergeMap
而不是 merge
,因为 merge
在创建链时立即订阅,这通常不是您想要的。
如果您使用 mergeMap(() => this.LoadAccountDetails())
,它只会在其源发出 next
值时调用回调。
我的身份验证服务中有一个登录功能,如果登录完成或 return HttpError,我希望它 return 具有一些值。然而,这一步很简单,如果初始登录有效,我还想包括使用第二个 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.
}
这取决于错误是作为 next
还是 error
通知发出,但很难从这个例子中分辨出来。
另外,问题可能是您可能想使用 mergeMap
而不是 merge
,因为 merge
在创建链时立即订阅,这通常不是您想要的。
如果您使用 mergeMap(() => this.LoadAccountDetails())
,它只会在其源发出 next
值时调用回调。