Advertisement
Guest User

RxJS

a guest
Feb 20th, 2020
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.69 KB | None | 0 0
  1. # RxJS - Pipe
  2. A função `pipe` é a linha de junção a partir da sua fonte de dados observáveis
  3. através seus operadores. Como um material bruto em uma fábrica passa por uma
  4. série de paradas antes de se tornar em um produto final, dados de fonte conseguem
  5. passar por uma pipeline de operadores onde você consegue manipular, filtrar, e
  6. transformar dados que se ajustam ao seu caso de uso. Não é raro usar 5 ou mais
  7. operadores dentro de uma observable chain, contido dentro de uma função `pipe`.
  8.  
  9.  
  10.  
  11.  
  12.  
  13. # RxJS - Operators
  14.  
  15. Operadores oferecem uma forma de manipular valores de uma fonte, retornando um
  16. observable dos valores transformados. Muitos dos operadores RxJS parecerão familiar
  17. se você está acostumado com os métodos `Array`.
  18. Por exemplo, se você quiser transformarvalores emitidos de uma observable source,
  19. você pode usar `map`.
  20. Se você quiser filtrar por valores específicos, você pode usar `filter`
  21. Em prática, se houver um problema que você precisa resolver, é mais que provável
  22. que tenha um operador para ele. E enquanto o número absoluto de operadores possa
  23. ser desgastante assim que você começa a sua jornada em RxJS, você pode reduzí-lo
  24. a algo pequeno e útil para começar a ser efetivo.
  25.  
  26.  
  27. ## Operadores conseguem agrupados em categorias comuns
  28. A primeira parada quando procurando pelo operador correto é encontrar uma categoria
  29. relacionada. Necessida filtrar dados de uma fonte? Olhe os operadores de 'filtragem'.
  30. Tentando encontrar um bug, ou depurar o fluxo de dados através da sua stream
  31. de dados? Há operadores 'utilitários' que possam resolver isso. As categorias
  32. de operadores incluem:
  33.  
  34. ### Operadores de Criação
  35. Esses operadores permitem a criação de um observable a partir de quase tudo.
  36. Do genérico a casos de uso específico você está livre de transformar tudo em um stream.
  37. Por exemplo, supondo que criamos uma barra de progresso assim que o usuário role
  38. a página em um artigo. Conseguiríamos transformar o evento de rolagem em uma
  39. stream utilizando o operador `fromEvent`.
  40. Os operadores de criação mais comuns são `of`, `from` e `fromEvent`.
  41.  
  42. ### Operadores de Combinação
  43. Os operadores de combinação permitem a junção de informação a partir de múltiplos
  44. observables. Ordem, tempo, e estrutura de valores emitidps são as variações primárias
  45. dentre esses operadores.
  46. Por exemplo, conseguimos combinar atualizações de diversas fontes de dados para performar
  47. um cálculo.
  48. Os operadores de combinação mais usados são `combineLatest`, `concat`, `merge`,
  49. `startWith`, `withLatestFrom`.
  50.  
  51. ### Operadores de Resolução de Erros
  52. Os operadores para lidar com erros oferecem formas efetivas para lidar com os
  53. erros graciosamente e performar novas tentativas, caso ocorram.
  54. Por exemplo, conseguimos usar `catchError` para proteger contra requisições
  55. de rede mal-sucedidas.
  56.  
  57. ### Operadores de Filtragem
  58. Os operadores de filtragem oferecem técnicas para aceitar - ou rejeitar - valores
  59. de uma fonte observável e lidar com 'contrapressão', ou a construção de valores
  60. dentro de uma stream.
  61. Por exemplo, conseguimos utilizar o operador `take` para capturar somente os 5
  62. primeiros valores emitidos de uma fonte.
  63. Os operadores de filtragem mais utilizados são `debounceTime`, `distinctUntilChanged`,
  64. `filter`,`take`, e `takeUntil`.
  65.  
  66. ### Operadores de Multicasting
  67. Em RxJS, observables são 'cold' ou 'unicast' (uma fonte por subscriber) por padrão.
  68. Esses operadores conseguem tornar um observable 'hot', ou 'multicast', permitindo
  69. efeitos colaterais serem compartilhados dentre múltiplos subscribers.
  70. Por exemplo, podemos querer que 'late subscribers' compartilhem e recebam o
  71. último valor emitido de uma fonte ativa.
  72. O operador de multicasting mais usado é o `shareReplay`.
  73.  
  74. ### Operadores de Transformação
  75. Transformar valores assim que eles passam em uma cadeia de operadores é uma
  76. tarefa comum. Esses operadores oferecem técnicas de transformação para praticamente
  77. qualquer caso de uso que você irá encontrar.
  78. Por exemplo, podemos querer acumular um objeto de estado a partir de uma fonte
  79. ao decorrer do tempo, similarmente ao Redux.
  80. Os operadores de trasformação mais utilizados são `concatMap`, `map`, `mergeMap`,
  81. `scan` e `switchMap`.
  82.  
  83.  
  84. ## Operadores tem comportamentos comuns
  85. Enquanto operadores conseguem ser agrupados em categorias comuns, operadores dentro
  86. de uma categoria habitualmente compartilham um comportamento comum. Reconhecendo
  87. esse comportamento comum você consegue começar criar uma árvore de
  88. "escolha seu próprio operador" na sua cabeça.
  89. Por exemplo, uma grande quantidade de operadores conseguem ser agrupados em...
  90.  
  91. ### Operadores que 'achatam'
  92. Ou em outras palavras, operadores que gerenciam a subscription de um observable
  93. interior, emitindo esses valores a uma única fonte observável. Um caso de uso comum
  94. para operadores de achatamento é lidar com requisições HTTP em um a API promise-based
  95. ou observable-based, porém isso está somente arranhando a superfície.
  96.  
  97. Podemos então dividir operadores de achatamento em comportamentos comuns como...
  98.  
  99. ### Operadores 'switch'
  100. Como um interruptor de luz, operadores baseados em `switch` desligarão (unsubscribe)
  101. o observable atual e ligarão um novo observable para emissões a partir daquela
  102. fonte. Operadores `switch` são úteis em situações que você não quer (ou precisa)
  103. mais do que um observable ativo por vez.
  104. Operadores baseados em 'switch' incluem `switchAll, `switchMap` e `switchMapTo`.
  105.  
  106. ### Operadores 'concat'
  107. Comparável a uma fila em uma máquina ATM, a próxima transação não consegue começar
  108. até que a anterior termite. Em termos de observable, somete uma subscription pode
  109. acontecer por vez, em ordem, disparado pela conclusão da anterior.
  110. Operadores 'concat' incluem `concat`, `concatAll`, `concatMap`, `concatMapTo`.
  111.  
  112. ### Operadores `merge`
  113. Como uma pista de fusão na interestadual, operadores baseados em `merge` dão suporte
  114. a múltiplos observables ativos fluindo em uma pista de maneira 'primeiro a chegar, primeiro a ser servido'
  115. Operadores `merge` são úteis em situações onde você quer disparar uma ação quando
  116. um evento de uma ou mais fontes ocorram:
  117.  
  118. ## Outras similaridades entre operadores
  119. Há também operadores que compartilham um objetivo similar mas oferecem flexibilidade
  120. em seus gatilhos. Por exemplo, para desinscrever de um observable após uma condição
  121. específica ser satisfeita, conseguimos utilizar:
  122. 1. `take` quando sabemos que somente iremos quer 'n' valores
  123. 2. `takeLast` quado queremos somente os últimos 'n' valores.
  124. 3. `takeWhile` quando temos uma expressão predicada para suprir.
  125. 4. `takeUntil` quando somente quisermos que a fonte permaneça ativa até outra
  126. fonte emitir.
  127.  
  128. Enquanto o número de operadores em RxJS consiga ser desgastante no começo, esses
  129. comportamentos e padrões comuns conseguem fazer ponte rapidamente enquanto se aprende
  130. RxJS.
  131.  
  132.  
  133.  
  134. ##
  135. Assim que você se torna familiar com programação 'push-based' através de Observables,
  136. você começa modelar todo comportamento assíncrono em suas aplcações através
  137. de streams observáveis. Isso abre soluções simples e flexibilidade para comportamento
  138. notavelmente complexo.
  139. Por exemplo, supondo que queiramos fazer uma requisição que salva atividade de usuário
  140. quando ele responde uma pergunta no quiz. Nossa implementação inicial pode usar
  141. o operator `mergeMap`, que dispara uma requisição de salvar a cada evento.
  142. Após, é determinado que precisamos assegurar ordem desses saves. Equipado com o
  143. conhecimento do comportamento dos operadores, ao invés de implementar um sistema
  144. complexo de fila, conseguimos substituir o operador `mergeMap` pelo `concatMap`
  145. e fazer o push das nossas mudanças.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement