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

[Dúvida] switchMap

Na component de Comentarios na funcao : gravar(): void { const coment = this.comentarioForm.get('comentario')?.value ?? ''; this.comentarios$ = this.comentariosService .createComents(this.id, coment) .pipe( switchMap(() => this.comentariosService.getComents(this.id)), tap(() => { this.comentarioForm.reset(); alert('Salvo Comentario'); }) ); }

ele utiliza esse switchMap , informando que vai trocar o fluxo de post para um get , mas nao entendi por qual motivo se faz isso. Nesse caso ele faz o post e logo em seguida já faz o get ?

6 respostas

Olá Pedro, tudo bem?

O switchMap é um operador de transformação. Com ele, é possível cancelar requisições de observables anteriores e emitir valores apenas do observable projetado mais recentemente.

Caso você tenha interesse em aprender mais sobre esse e diversos outros operadores, te convido a fazer o curso de RxJS novinho que foi publicado ontem na plataforma.

Abraços, bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado. ✓

Opa Nayanne, bom dia , eu consegui entender para o que ele e usado, mas eu não consegui entender por qual motivo o instrutor utiliza nessa etapa. Eu nao consegui identificar o raciocio dele. Se eu quero criar um comentário , pq eu alteria o observable da requisicao para uma get e nao um post?

Pedro, você pode me passar qual o vídeo onde o instrutor faz essa alteração? Assim, posso assistir e tentar entender a intenção dele. Obrigada!

Claro, https://cursos.alura.com.br/course/angular-controle-fluxo-navegacao/task/91346 6 minutos para frente essa etapa do switchMap

solução!

Pedro, vi o vídeo e o seu raciocínio inicial está correto. O que acontece é que o método gravar está responsável tanto por incluir um novo comentário quanto por trazer a lista de comentários existentes, atualizada inclusive com o último comentário adicionado.

gravar(): void {
    const comentario = this.comentarioForm.get('comentario')?.value ?? '';
    this.comentarios$ = this.comentariosService
      .incluiComentario(this.id, comentario)
      .pipe(
        switchMap(() => this.comentariosService.buscaComentario(this.id)),
        tap(() => {
          this.comentarioForm.reset();
          alert('Salvo Comentário');
        })
      );
  }
  • No método acima, o valor inserido no comentário é guardado numa constante e depois é feita a atribuição de valores ao observable comentarios$;
  • Esse observable vai inserir um comentário através do método incluiComentario, presente no service, que utiliza o método post;
  • Após isso, para conseguir mudar o fluxo, é utilizado o operador switchMap. Por isso, o instrutor fala que "o fluxo que está vindo é o de inclusão, quero convertê-lo para o fluxo de buscar os comentários do servidor";
  • O switchMap, por sua vez, vai cancelar a requisição anterior do Observable Comentario e trocar pela emissão de valores do Observable Comentarios;
  • Assim, é possível agora consumir o outro método do service, o buscaComentario, que utiliza o get para trazer os dados da API, no caso, os comentários, já contendo o comentário que a pessoa acabou de adicionar.

No finalzinho do vídeo Incluindo na página de detalhes, quando o instrutor adiciona alguns comentários, perceba que ao adicionar, quando aparece o alert, os comentários ainda não estão renderizados na aplicação, aparecem depois da confirmação, após a busca da lista de comentários atualizados.

Espero ter ajudado, bons estudos! :)

Muito obrigado , agora consegui entender o raciocino!

Bom trabalho e ate a proxima.