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

Tap não está sendo executado

No meu caso, o tap parece não estar executando. Já coloquei console.log e breakpoint(estou usando a extension do chome). Apesar de os breakpoints funcionarem em toda a aplicação normalmente, no tap ele não para.

Tentei colocar um console.log, mas também não surtiu efeito. Segue abaixo o meu código.

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';

const API_URL = 'http://localhost:3000';

@Injectable({ providedIn: 'root' })
export class AuthService
{
    constructor(protected http: HttpClient) {}

    public autenticate(userName: string, password: string) : Observable<Object>
    {
        const observable = this.http.post(API_URL + '/user/login', {userName, password}, { observe: 'response' });

        observable.pipe(tap(response => {
            const authToken = response.headers.get('x-access-token');
            console.log(authToken);
        }));

        return observable;
    }
}
4 respostas

Você tem certeza que o método autenticate esta sendo chamado? A API do curso esta de pé? Você esta utilizando um login válido? Fica tranquilo que vamos descobrir, até porque muitos alunos já terminaram o curso sem problema algum.

Outra coisa, não sei se é o caso, mas já vi aluno não salvar o arquivo ou estar com o CLI parado na alteração e por isso não ver a alteração em ação, não custa nada verificar.

O método autenticate está sendo chamado sim, coloquei breakpoints pra garantir isso e o fluxo do app está passando por lá. Só não executa o tap, coloquei um breakpoint lá dentro. Console.log também não executa lá dentro.

A API do curso está de pé, e retorna resultados normalmente. Tanto de sucesso no login quanto de falha em caso de usuário e senha inváldos.

O CLI não estava parado, foi a primeira coisa que eu testei. Tudo é executado normalmente, mas o fluxo do app não entra no tap. Será que eu digitei algo errado? Ou importei algo errado?

Estou num impasse. Não sei o quê eu fiz de errado.

solução!

Bom, olhando seu código mais uma vez, vi que mudou o código, talvez sem conhecer as consequências da sua modificação (o código não está igual ao que eu ensino no curso). O pipe retorna um novo observable com o tap, no caso, você esta retornando o observable sem o pipe. Observables são imutáveis. A maneira que eu organizei o código não foi por simples estética, altere seu código para:

 public autenticate(userName: string, password: string) : Observable<Object>
    {
        const observable = this.http.post(API_URL + '/user/login', {userName, password}, { observe: 'response' });
      // pipe retorna um novo Observable com  a operação associada 
        return observable.pipe(tap(response => {
            const authToken = response.headers.get('x-access-token');
            console.log(authToken);
        }));
    }

Ou como eu faço:

 public autenticate(userName: string, password: string) : Observable<Object>
    {
      // pipe retorna um novo Observable com  a operação tap associada 
        return this.http.post(API_URL + '/user/login', {userName, password}, { observe: 'response' }).pipe(tap(response => {
            const authToken = response.headers.get('x-access-token');
            console.log(authToken);
        }));
    }

Do jeito que seu código estava, ele sempre retornava o Observable original e nunca o novo criado com o operador pipe.

Sucesso e bom estudo!

Ah tá. Entendi.

Assim que tiver a oportunidade testarei e vou postar aqui o resultado.

Obrigado pela ajuda ;-)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software