Вот мой Angular Auth Guard. Он проверяет состояние входа в систему, затем получает от него идентификатор, если он существует, и проверяет профиль, назначенный этому идентификатору.
Я пытаюсь разрешить охрану, ожидающую завершения этих двух наблюдаемых в порядке с помощью метода 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;
});
}
}