一个好的做法是使用mergeMap 像这样链接 API 调用:
onSubmit(): void {
this.authService.login(this.loginForm.value).pipe(
mergeMap(() => this.authService.getCurrentUser()),
catchError(err => this.alertService.error(err.error)),
finalize(() => this.router.navigate([this.returnUrl]))
).subscribe(u => {
localStorage.setItem('role', u.role);
});
}
另外请注意,我直接在管道中添加了catchError,但您也可以在订阅中捕获错误,如下所示:
onSubmit(): void {
this.authService.login(this.loginForm.value).pipe(
mergeMap(() => this.authService.getCurrentUser())
).subscribe(
u => localStorage.setItem('role', u.role),
err => this.alertService.error(err.error),
() => this.router.navigate([this.returnUrl])
);
}
您的代码中的另一件重要的事情是您将导航放置在 finally 块中,这意味着您将在成功 或 错误的两种情况下重定向。这就是我在第一个示例中放置finalize 的原因。如果路由打算仅成功,则代码应为:
onSubmit(): void {
this.authService.login(this.loginForm.value).pipe(
mergeMap(() => this.authService.getCurrentUser()),
catchError(err => this.alertService.error(err.error))
).subscribe(u => {
localStorage.setItem('role', u.role);
this.router.navigate([this.returnUrl]);
});
}
或
onSubmit(): void {
this.authService.login(this.loginForm.value).pipe(
mergeMap(() => this.authService.getCurrentUser())
).subscribe(
u => {
localStorage.setItem('role', u.role);
this.router.navigate([this.returnUrl]);
},
err => this.alertService.error(err.error)
);
}