Assincronicidade
Backpressure
Rx vs Promise, Async e Future
Existe em outras linguagens
Pattern Observer
Processamento ocorre em um momento arbitrário do tempo
Cliente não pode observar diretamente o serviço
0. Invalidação de Cache
1. Nomear as coisas
7. Chamadas assíncronas
2. Erros de índice em listas
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
Cópia de Arquivo em um HD
Chamadas entre microsserviços
Renderização de UI e interação com usuário
Controlar o Producer
Fazer um Buffer
Jogar fora os dados (Drop)
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 |
Single | Multiple | |
Pull | Function | Iterator |
Push | Promise | Observable |
| Os Observables produzem vários valores! |


A observação começa com subscribe
Múltiplos observadores podem subscrever um mesmo Observable
Criação
Utilitários
Transformação
Filtro
Combinação
Gestão de Erros
Multicasting
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 |
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
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
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'))
delay: atrasa os valores emitidos de um determinado tempo
repeat: emitir novamente os valores
tap: efetuar uma ação dentro de um pipe
Parecidos com métodos de array
map processa cada evento
mapTo emite um valor constante
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 |


scan parecido com reduce dos arrays
groupBy agrupa valores de acordo com um critério
pluck seleciona as propriedades a emitir

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
Emitir somente alguns valores recebidos
filter emite valores quando um predicado é verdadeiro
skip, skipUntil e skipWhile para não emitir os primeiros valores
first: emite somente o primeiro valor
last: emite somente o último valor
find: emite o primeiro item que passa um predicado, e completa
debounceTime: remover valores que demoram menos que um determinado tempo
throttleTime: emitir os últimos valores depois de uma determinada duraçã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
Cold vs Hot Observables:
Por padrão os Observables são Cold, ou Unicast
Esses operadores permitem que os Observables fiquem Hot
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
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
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
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