在 Angular auth guard 中等待两个 observables 按顺序完成
Wait for two observables to finish in order in an Angular auth guard
这是我的 Angular 授权守卫。它检查登录状态,然后从中获取一个 ID(如果它存在)并检查分配给该 ID 的配置文件。
我正在尝试使用 zip 方法解决守卫等待这两个可观察对象按顺序完成的问题,但是 checkProfileOnline 返回错误,因为 uid 未定义,因此没有等待第一个可观察对象完成。
@Injectable()
export class AuthGuard implements CanActivate {
constructor(
private authService: AuthService,
private userService: UserService,
private router: Router
) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
let obsArray: Observable<boolean>[] = [];
obsArray.push(this.checkAuthOnline(), this.checkProfileOnline());
// CHECK FOR AUTH AND PROFILE ONLINE
return Observable.zip(obsArray).map(res => {
if (res[0] && res[1]) {
return true;
}
return false;
});
}
checkProfileOnline(): Observable<boolean> {
return this.userService.userCheck(this.authService.uid).map(profile => {
if (profile) {
this.userService.user = profile;
return true;
}
this.router.navigate(['/']);
return false;
});
}
checkAuthOnline(): Observable<boolean> {
return this.authService.authStatus().map(loggedIn => {
if (loggedIn) {
this.authService.uid = loggedIn.uid;
return true;
}
return false;
});
}
}
而不是 zip
你可以等到第一个 observable 完成 concatMap
然后 运行 第二个。然后第二个结果将映射到对它们的&&
操作。
return checkAuthOnline()
.concatMap(res1 => checkProfileOnline()
.map(res2 => res1 && res2)
)
这是我的 Angular 授权守卫。它检查登录状态,然后从中获取一个 ID(如果它存在)并检查分配给该 ID 的配置文件。 我正在尝试使用 zip 方法解决守卫等待这两个可观察对象按顺序完成的问题,但是 checkProfileOnline 返回错误,因为 uid 未定义,因此没有等待第一个可观察对象完成。
@Injectable()
export class AuthGuard implements CanActivate {
constructor(
private authService: AuthService,
private userService: UserService,
private router: Router
) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
let obsArray: Observable<boolean>[] = [];
obsArray.push(this.checkAuthOnline(), this.checkProfileOnline());
// CHECK FOR AUTH AND PROFILE ONLINE
return Observable.zip(obsArray).map(res => {
if (res[0] && res[1]) {
return true;
}
return false;
});
}
checkProfileOnline(): Observable<boolean> {
return this.userService.userCheck(this.authService.uid).map(profile => {
if (profile) {
this.userService.user = profile;
return true;
}
this.router.navigate(['/']);
return false;
});
}
checkAuthOnline(): Observable<boolean> {
return this.authService.authStatus().map(loggedIn => {
if (loggedIn) {
this.authService.uid = loggedIn.uid;
return true;
}
return false;
});
}
}
而不是 zip
你可以等到第一个 observable 完成 concatMap
然后 运行 第二个。然后第二个结果将映射到对它们的&&
操作。
return checkAuthOnline()
.concatMap(res1 => checkProfileOnline()
.map(res2 => res1 && res2)
)