Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

198
Visualizações
Negating the result of a promise in a guard

I have a working angular2 guard with a canActivate() that calls a service for isLoggedIn() and returns a promise which then resolves and the route is handled appropiately.

However, I am trying to do the opposite, see when the user is not logged in, and it isn't working.

I tried something as simple as this (adding a ! operator), hoping it would work:

@Injectable()
export class AuthGuard implements CanActivate {
    constructor(private authService: AuthService) {}

    canActivate() {
        return !this.authService.isLoggedIn();
    }
}

However, this always returns a falsey value and the route never activates.

This is a relevant excerpt of my isLoggedIn() function:

isLoggedIn(): Promise<Boolean> {
  var component = this;
  return new Promise((resolve, reject) => {       
      component.queryForUser((user) => {
        resolve(user != null);
      });
    }
  });
}

If the user is not equal to null, then he is logged in and the promise resolves with true. Else, false.

While I could simply add a parameter to specify which state I am looking for, or even create a isNotLoggedIn() function, with the same logic but inverted, I ask, Is there a way to negate the value of the promise's resolve for the canActivate()?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

return !this.authService.isLoggedIn() won't work, because of how JS works. this.authService.isLoggedIn() is promise object and is truthy. !this.authService.isLoggedIn() will always be false.

Instead, promise result should be mapped to negated result with

canActivate() {
    return this.authService.isLoggedIn().then(result => !result);
}

Or

async canActivate() {
    return !(await this.authService.isLoggedIn());
}

The parentheses around await ... are optional and used for readability.

over 4 years ago · Santiago Trujillo Relatório

0

All you need to do is some further manipulation of the promise's resolved value:

canActivate() {
    return this.authService.isLoggedIn().then(loggedIn => !loggedIn);
}
over 4 years ago · Santiago Trujillo Relatório

0

And if you're inside an if statement and async/await is enabled move the negation inside the parenthesis.

if (!await client.bucketExists('test')) {}
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda