Подождите, пока две наблюдаемые завершат порядок в Angular Auth Guard
Вот мой 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;
});
}
}
1 ответ
Решение
Вместо zip
вы можете подождать, пока закончится первая наблюдаемая concatMap
а затем запустить второй на. Тогда второй результат будет сопоставлен с &&
операция на них обоих.
return checkAuthOnline()
.concatMap(res1 => checkProfileOnline()
.map(res2 => res1 && res2)
)