Показать сообщение отдельно
  #13 (permalink)  
Старый 30.12.2019, 13:37
Аспирант
Отправить личное сообщение для sniffysko Посмотреть профиль Найти все сообщения от sniffysko
 
Регистрация: 20.10.2009
Сообщений: 79

Сообщение от Vadya Посмотреть сообщение
Для меня это пока темный лес. Сохранил на потом, а пока хоть как-то сделать, но чтобы заработало.

public isAuthenticated(): any {

this.userService.getUser().subscribe(data => (this.user = data));
// Здесь как то надо увидеть this.user.login

}
Вы не ответили зачем вам асинхронный запрос. Асинхрон нужен только если вы лезете на бэк за данными пользователя. Асинхрон это не прерогатива сервисов, а типов запроса. Если пользователь хранится в сервисе, то:
Для Юзер сервиса дописываем функцию:
export class UserService{
    isAutentificated: boolean = false;
    userInfo: UserInfo

    constructor(
        http: HttpService
    ){}

    // Синхронная!
    isAuthenticated(): boolean {
       return this.isAutentificated;
    }

    // Асинхронная
    authUser(data: {login: string, password}){
        this.gttp.post('api/url').subscribe(
            (data: UserInfo) => {
                if(data){
                    this.userInfo = data;
                    this.isAutentificated = true;
                }
            }
        );
    }
}


authUser вызываем после того, как в форме логина вводим логин и пароль. Из компонента логина.
А теперь ваш код в гуарде:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) : Observable<boolean> | boolean{
            if(this.userService.isAuthenticated()) { // Сейчас придет. Функция синхронная. 
                return true;
            } else {
                this.router.navigate(['/login']);
            }
   }


Если isAuthenticated все-же должен быть асинхронным, то подход другой.
Что-то типа такого (вы же понимаете, что и код функции isAuthenticated будет через обсерверы и не такой как в примере выше):
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) : Observable<boolean> | boolean{
            return this.userService.isAuthenticated()
               .subscribe( (data: boolean) => {
                    return data;
               });
   }


Что-то типа так. Пусть меня поправят более опытные товарищи. Пишу навскидку. Но смысл таков: если функция асинхронная, подписываемся на нее и полученный в подписке рузультат возвращаем. Когды вы выставите тыпы в вашем коде среда разработки подскажет вам какие функции можно вписать.
Ответить с цитированием