Executando verificação de segurança...
6

O uso do RxJS em uma aplicação robusta baseada em eventos

Denis Wilton de Paula Azevedo
Frontend Developer at Nelogica
https://www.linkedin.com/in/deniswpazevedo/

O que é o RxJS?

RxJS é uma biblioteca para composição assíncrona para aplicações baseadas em eventos utilizando sequências de Observables.

Ela combina os padrões de projeto Observer e Iterator propostos no icônico livro da ciência da computação, “Design Patterns: Elements of Reusable Object-Oriented Software” da autoria de Erich Gamma, Richard Helm, Ralph Johnson, e John Vlissides, mais conhecidos como “The Gang of Four”. Além de alguns princípios de pureza advindos da programação funcional.

Uma dos princípios mais poderosos que o RxJS carrega é o princípio da pureza, amplamente evangelizado pela programação funcional, pois propõe um código testável, limpo e menos propenso a erros de estados imprevistos na aplicação. Um princípio que norteia a base de código de grandes aplicações, como o ReactJS, biblioteca responsável pela maior parte dos novos projetos front-end atualmente.

O RxJS possui uma série de operadores utilitários responsáveis por transformar uma stream de dados. Eles podem ser categorizados como transformadores, filtros, combinadores, utilitários, condicionadores, agregadores e multi-propagadores. Um operador é essencialmente uma função construída na fundação de um Observable que permite uma manipulação sofisticada.

Observables

Um Observable é uma stream, e uma stream é uma sequência de dados disponibilizados ao longo de um período.

Para sintetizar, pense que Promises reagem com base na resposta de uma solicitação, que pode falhar ou ser bem sucedida. Já os Observables disponibilizam uma série de dados ao longo do tempo, e seus inscritos fazem deles o que bem entenderem.

Disponibilidade” é uma palavra-chave importante para entender o conceito da programação reativa.

Essa sequência de dados pode variar desde um simples incremental que perdura por 6 segundos produzindo uma sequência de inteiros (0, 1, 2, 3, 4, 5), ou coordenadas (X, Y) do Mouse na viewport, até valores de entrada em um formulário ou mensagens recebidas por Web sockets ou API responses. Fato é que tudo isto podem ser dados coletados ao longo de um período, e isso tudo pode ser tanto síncrono quanto assíncrono.
Um Observable possui um ciclo de vida bem definido por sua criação, inscrição, execução e destruição!

Vantagens sobre as Promises

Valor único vs. Valores múltiplos

Promises sempre se resolverão com o primeiro valor passado para a função resolver, e ignora futuras chamadas a esta função. Ao contrário, um Observable permite que você resolva vários valores e complete-o arbitrariamente.

Imediata vs. Lazy

Promises possuem um design imediato, isso significa que suas responsabilidades serão cumpridas no momento de sua construção. Já os Observables são lazy, isto é, seu construtor será chamado tão somente quanto realmente alguém se inscrever a ele. Isto significa que nada acontecerá caso ninguém utilize um Observable.

Promises não são canceláveis

Eventualmente, você já deve ter se deparado com o fato de que uma Promise não pode ser revogada. Esta é uma importante feature que está prevista para entrar em uma próxima release da linguagem, no entanto, hoje, necessitamos de caminhos alternativos para esta feitoria. Já os Observables suportam cancelamento de tarefas assíncronas naturalmente, bastando uma desinscrição ao próprio. No momento da desinscrição de um Observable, todo o fluxo de tarefas assíncronas do Observable é interrompido.

Performance e Produtividade

Nos quesitos de performance e produtividade, o RxJS brilha muito mais nos critérios de QA (Quality Assurance), uma vez que possui soluções especialistas em um problema específico.

O operador switchMap, por exemplo, é responsável por realizar, de forma inerente, toda a cadeia de efeitos colaterais na mudança de um argumento pregresso. A chance de captarmos bugs decorrentes da falta de desinscrição de um estado anterior seria muito maior se tivéssemos que manipular essa tratativa de forma manual.
Em paralelo, ao prover este ganho de qualidade, é intrínseco o ganho de performance, uma vez que o gerenciamento de inscrições e desinscrições acarreta na liberação de uso de memória e tráfego de dados na aplicação.

Fontes

https://blog.bitsrc.io/reactive-programming-in-javascript-with-rxjs-9db53c07ef14
https://blog.mimacom.com/eight-reasons-why-you-should-be-using-rxjs/
https://rxjs.dev/guide/overview

Carregando publicação patrocinada...
2

Denis, artigo muito bem escrito! Parabéns! E eu editei ele adicionando umas quebras de linha, dado que o Markdown separa melhor os parágrafos quando você adiciona duas quebras de linha por parágrafo. Veja se ficou melhor assim 🤝

Em paralelo, no passado trabalhei com Bolsa de Valores e o nome Nelogica me traz boas recordações! Sempre foi uma empresa com soluções de altíssima qualidade 👍

2

Ficou muito melhor. Eu escrevi o artigo num PDF, e fui copiando para o editor do Tabnews. Hahaha. Deve ter sido a causa dos problemas de formatação.
Mas, muito obrigado pelo ajuste!

Sim, trabalhar na Nelogica me traz muito orgulho! É uma empresa exemplar tanto no produto, quanto na comunidade de colaboradores! Empresa fantástica!

1
1

Olá dazevedo, tudo bem?

Artigo sensacional e muito bem escrito! Muito obrigado por este conhecimento!!!

Streams são sensacionais! Acredito que a melhor forma de entendê-los é imaginar um rio, bem definido, com águas continuas e streams seriam os córregos, ou melhor, um local por onde a água poderia dar vasão também... o rio continuará existindo, mas compartilhará águas com os córregos continuamente.

Só uma pequena contribuição (peço perdão se for chato nisso):

Mudar "para" para "de":

composição assíncrona para aplicações baseadas em eventos

Mudar "quanto" para "quando":

será chamado tão somente quanto realmente alguém