Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Requisição síncrona

Preciso que seja feita uma verificação ao abrir uma nova aba e que verifique se o cliente está logado.

tenho a seguinte requisição

public isLoggedBack() {
        const uri =  '/usuario/v1/isLogado/';
        let res = this.httpClient.get<LoginResponse>(API_URL + uri, {
            headers: {},
            params: {},
            observe: 'response',
            withCredentials: true
        });

        return res.map(r => r.body);

    }

serve para ver se o usuário está logado


    canActivate(route: ActivatedRouteSnapshot,
                state: RouterStateSnapshot) {


        if (this.authService.isLoggedIn()) {
            return true;
        }else {
            this.authService.isLoggedBack().subscribe(
                data => {
                    let loginResponse = data;
                    this.authService.login(loginResponse);

                    return true;
                }
            );

            this.router.navigate(['/auth/login']);

        }
        return false;
    }

mas no primeiro momento a requisição fica com o status de "pending" por ser assíncrona, e a requisição só é realmente feita após ele fazer o redirecionamento para a tela de login novamente, existe alguma forma de fazer com que não redirecione até realmente a resposta do servidor chegar?

ou se existe alguma outra forma de fazer com que eu abra uma nova aba e ele saiba que eu ainda estou logado.

consegui até fazer alguma coisa mas, tive que guardar a url e após isso fazer um navigate para ela ficando algo tipo assim

this.authService.isLoggedBack().subscribe(
                data => {
                    let loginResponse = data;
                    this.authService.login(loginResponse);

                    this.router.navigate([this.route]);
                    return true;
                }
            );
3 respostas
solução!

Boa tarde, Luiz! Como vai?

A forma correta de proceder é justamente fazendo a navegação apenas quando vc tem certeza que a requisição foi respondida, o que só é possível dentro do subscribe(). Portanto, está correta a ideia do que vc implementou no último trecho de código que vc postou!

Dica: O ideal é que alguma indicação visual seja dada ao usuário do sistema quando requisições assíncronas estiverem sendo processadas! Vc pode fazer isso usando, por exemplo, um loading.

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Muito obrigado, queria tentar fazer uma forma mais simples mas se esse é o correto fico com ele mesmo.

Valeu

Por nada, Luiz! Sempre que tiver qualquer dúvida é só mandar aqui no fórum!

Grande abraço e bons estudos!