Programação reativa

Conceitos

  • Assincronicidade

  • Backpressure

  • Rx vs Promise, Async e Future

  • Existe em outras linguagens

  • Pattern Observer

Assincronicidade

  • Processamento ocorre em um momento arbitrário do tempo

  • Cliente não pode observar diretamente o serviço

Coisas complexas em programação

  • 0. Invalidação de Cache

  • 1. Nomear as coisas

  • 7. Chamadas assíncronas

  • 2. Erros de índice em listas

Backpressure

  • Nome vem da mecânica dos fluidos

  • Acontece quando o progresso de tornar uma entrada em saída encontra resistência

  • Um componente deve comunicar quando está sob pressão

Backpressure - Exemplos

  • Cópia de Arquivo em um HD

  • Chamadas entre microsserviços

  • Renderização de UI e interação com usuário

Backpressure ilustrada

Estratégias para lidar com BackPressure

  • Controlar o Producer

  • Fazer um Buffer

  • Jogar fora os dados (Drop)

Push vs Pull

Producer

Consumer

Pull

Passivo: produz dados quando solicitado

Ativo: decide quando os dados são solicitados

Push

Ativo: produz dados no seu ritmo

Passivo: reage nos dados recebidos

Push vs Pull

Single

Multiple

Pull

Function

Iterator

Push

Promise

Observable

Os Observables produzem vários valores!

Hollywood Principle

hollywood principle

Pattern Observer

observer

Observadores

  • A observação começa com subscribe

  • Múltiplos observadores podem subscrever um mesmo Observable

Operadores - Classificação

  • Criação

  • Utilitários

  • Transformação

  • Filtro

  • Combinação

  • Gestão de Erros

  • Multicasting

Uso dos operadores

  • Cada operador é uma função que chama uma outra função

  • Existe o método pipe para combinar operadores

  • Um conjunto de operadores é chamado de receita (recipe)

Dentro de um pipe os Observables não são modificados, um operador sempre retorna um novo Observable

Criação de Observables

Principais maneiras de criar um Observable

  • Do zero com create

  • Convertendo Promises, Iterables e String com from

  • A partir de valores quaisquer em sequência com of

  • Uma requisição Ajax com ajax

  • A partir de um evento: fromEvent

Criação de Observables

  • interval: eventos espaçados em um intervalo de tempo

  • timer: depois de um delay inicial, emitir a cada intervalo

  • range: emite uma faixa de valores

Subscrever a um Observable

O método subscribe permite subscrever, receber os eventos emitidos:

subscribe(
            val => console.log('Valor: ', val),
            err => console.log('Error: ', err),
            () => console.log('Observable completou'))

Operadores utilitários

  • delay: atrasa os valores emitidos de um determinado tempo

  • repeat: emitir novamente os valores

  • tap: efetuar uma ação dentro de um pipe

Operadores de Transformação 1/3

Parecidos com métodos de array

  • map processa cada evento

  • mapTo emite um valor constante

Operadores de Transformação 2/3

  • switchMap substitui o Observable atual por um novo

  • switchMapTo utiliza o mesmo Observable interno

  • mergeMap subscrições internas múltiplas ativas ao mesmo tempo

flatMap é um sinônimo de mergeMap

switchmap

switch map

mergemap

mergeMap

Operadores de Transformação 3/3

  • scan parecido com reduce dos arrays

  • groupBy agrupa valores de acordo com um critério

  • pluck seleciona as propriedades a emitir

groupBy

groupBy

Operadores de Filtro 1/4

Emitir somente alguns valores recebidos

  • take emite n valores e termina

  • takeLast emite os n últimos valores

  • takeWhile emite valores até um predicado ser falso

Operadores de Filtro 2/4

Emitir somente alguns valores recebidos

  • filter emite valores quando um predicado é verdadeiro

  • skip, skipUntil e skipWhile para não emitir os primeiros valores

Operadores de Filtro 3/4

  • first: emite somente o primeiro valor

  • last: emite somente o último valor

  • find: emite o primeiro item que passa um predicado, e completa

Operadores de Filtro 4/4

  • debounceTime: remover valores que demoram menos que um determinado tempo

  • throttleTime: emitir os últimos valores depois de uma determinada duração

DebounceTime

debounceTime

ThrottleTime

throttleTime

Operadores de Combinação

Juntar os resultados de vários Observables

  • zip junta os valores emitidos por todos os Observables

  • forkJoin quando todos os observáveis completam emitir o último valor de cada um

  • merge torna múltiplos Observables em um único Observable

Operadores de Multicasting

Cold vs Hot Observables:

  • Por padrão os Observables são Cold, ou Unicast

  • Esses operadores permitem que os Observables fiquem Hot

Cold Observables

  • A sequencia começa a ser emitida depois da primeira subscrição

  • O Observable cria o Producer de valores

  • Cada Subscriber recebe a sequencia a partir do primeiro valor

Hot Observables

  • Os valores são produzidos mesmo sem subscrição ativa

  • O Observable encapsula um Producer existente

  • Os Subscribers recebem os valores que são produzidos naquele momento

Operadores de Multicasting

  • publish: transforma um Cold Observable em Hot Observable. Retorna um ConnectableObservable

  • publishReplay: como publish mas tem um Buffer de valores

  • share como publish, mas com refCount

  • shareReplay como share, mas com Buffer

Operadores de Gestão de Erros

  • retry: tente de novo emitir uma sequencia um n número de vezes em caso de falha

  • retryWhen: como retry mas somente de acordo com um critério

  • catchError: interceptar os erros e retornar um novo Observable