3
respostas

rxjs pipe e switchMap

this.comments$ = this.photoService.
      addComment(this.photoId, comment).
      pipe(switchMap(() =>
        this.photoService.getComments(this.photoId)
      )).
      pipe(tap(() => {
        this.commentForm.reset();
        console.log('Comentario adicionado com sucesso !');
      }));

Antes da alteração de código acima, tínhamos o seguinte:

this.photoService.
      addComment(this.photoId, comment).
      subscribe(() => {
        this.commentForm.reset();
        console.log('Comentario adicionado com sucesso !');
      });

Dúvidas:

1) Quem, no primeiro trecho de código acima, é o responsável por fazer o subscribe que era feito no segundo trecho de código?

2) O pipe() faz a execução do código se tornar síncrona? Ou seja, para executar um trecho de código dentro de um pipe, então tudo o que foi feito append anteriormente já fio concluído?

3 respostas

Fala ai Sandro, tudo bem? Vamos lá:

1) Quem, no primeiro trecho de código acima, é o responsável por fazer o subscribe que era feito no segundo trecho de código?

No caso seria o último pipe:

pipe(tap(() => {
        this.commentForm.reset();
        console.log('Comentario adicionado com sucesso !');
      }));

Assim que os pipe's anteriores forem resolvido, ele vai cair nesse vai fazer o reset do form.

2) O pipe() faz a execução do código se tornar síncrona? Ou seja, para executar um trecho de código dentro de um pipe, então tudo o que foi feito append anteriormente já fio concluído?

O pipe vai ser executado quando o Observable for resolvido, ele não necessariamente vai ser síncrono.

Oi Matheus, para confirmar o entendimento:

1) Quando você diz "O pipe vai ser executado quando o Observable for resolvido", então significa que o Observable já recebeu uma resposta do backend? É isso que você quer dizer com Observable resolvido?

2) Em relação ao primeiro trecho de código que postei, existe alguma chance do photoService.getComments() receber uma resposta do backend antes de photoService. addComment() receber a sua resposta do backend? Ou o photoService.getComments() só será executado após a chamada ao backend feita pelo photoService. addComment() ter sido completada?

Grato.

Fala Sandro, vamos lá:

1) Quando você diz "O pipe vai ser executado quando o Observable for resolvido", então significa que o Observable já recebeu uma resposta do backend? É isso que você quer dizer com Observable resolvido?

Exatamente, caso o Observable seja referente à uma requisição para o back-end, então sim.

Em relação ao primeiro trecho de código que postei, existe alguma chance do photoService.getComments() receber uma resposta do backend antes de photoService. addComment() receber a sua resposta do backend? Ou o photoService.getComments() só será executado após a chamada ao backend feita pelo photoService. addComment() ter sido completada?

O getComments só será chamado após o addComment ter sido completado e nenhum erro ter ocorrido.

Espero ter ajudado.

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