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

Observe e pipe

Ao assistir essa aula, fiquei com duas dúvidas. A primeira é a "configuração especial" no terceiro parâmetro do POST, com o observe: response. Eu percebi que fez o código funcionar, mas não entendi bem o porquê precisar dele. Seria possível citar uma outra situação onde seja preciso usar esse terceiro parâmetro, além de capturar o header? Ou então, quais seriam outros valores possíveis para o parâmetro observe.

A minha outra dúvida ficou em relação ao pipe. Na transcrição é feita essa afirmação: "Então, quando fazemos subscribe(), sabe-se que é preciso executar a operação do tap antes". Porém fiz alguns testes e caso a autenticação falhe, o pipe não é executado. Talvez eu tenha entendido errado desde que se mencionou o subscribe pela primeira vez, mas, não é apenas no subscribe que se saberá se o POST foi feito com sucesso ou não? O pipe no authService não deveria ser sempre executado?

5 respostas

Fala ai Jackson, tudo bem? Vamos lá:

Seria possível citar uma outra situação onde seja preciso usar esse terceiro parâmetro, além de capturar o header? Ou então, quais seriam outros valores possíveis para o parâmetro observe.

O observe pode receber três valores, sendo: body (padrão), events e response.

O response irá nos trazer os dados da resposta, um deles pode ser os cabeçalhos (headers).

O events é usado para realizar barra de progresso, ou seja, durante o upload ou download de um arquivo queremos adicionar uma barra informando o progresso atual.

Talvez eu tenha entendido errado desde que se mencionou o subscribe pela primeira vez, mas, não é apenas no subscribe que se saberá se o POST foi feito com sucesso ou não? O pipe no authService não deveria ser sempre executado?

Precisa ver onde e como está sendo feito o pipe, você deve fazer ele dentro do seu serviço e retornar um erro ou sucesso para quem realizar o subscribe realizar esse tratamento.

Onde o primeiro parâmetro so subscribe seria uma função para casos de sucesso e o segundo para casos de erros.

Espero ter ajudado.

Certo, sobre o Observe eu entendi.

Referente ao pipe, a implementação está conforme o conteúdo do curso:

Código da classe AuthService

export class AuthService {

  constructor(private http: HttpClient, private tokenService: TokenService) { }

  authenticate(userName: string, password: string) {
    return this.http
              .post(API_URL + '/user/login',
                    { userName: userName, password: password },
                    {observe: 'response'} )
              .pipe(tap(res =>{
                const authToken = res.headers.get('x-access-token');
                this.tokenService.setToken(authToken);
                console.log(`User ${userName} authenticated with token ${authToken}`);
              }));
  }

}

E aqui o método login() do SigninComponent

  login() {

    const userName = this.loginForm.get('userName').value;
    const password = this.loginForm.get('password').value;

    this.authService
        .authenticate(userName, password)
        .subscribe(
            () => this.router.navigate(['user', userName]),
            err => {
                console.log(err);
                this.loginForm.reset();
                this.platformDetectorService.isPlatformBrowser() && this.userNameInput.nativeElement.focus();
                alert('Invalid username or password');
            }
        );
  }

O pipe do authService nesse caso (usando o console.log como base, visto que nada é exibido no console) apenas é executado quando a autenticação ocorre com sucesso. Caso contrário, é exibido o alert na tela, o que pra mim faz sentido, visto ser um erro. Porém o pipe, que no meu entender seria sempre executado, não é chamado. Essa é minha dúvida nisso, do porquê o pipe não ser executado se der erro na requisição. De acordo com a aula, eu havia entendido que ele deveria ser sempre invocado. Obrigado.

solução!

Fala ai Jackson, o pipe ou uma cadeia de operadores somente são executados em caso de sucesso, ou seja, quando não ocorre nenhum erro durante o fluxo.

Caso ocorre algum erro, os mesmos não são executados, dai a gente precisaria realizar algum tratamento nesses erros seja com operadores ou não.

Espero ter ajudado.

Entendi, obrigado.

Magina Jackson, sempre que precisar não deixe de criar suas dúvidas.

Abraços e bons estudos.