Skip to content

Creation Functions Condicionais

Creation Functions selecionam um Observable com base em uma condição ou geram dinamicamente um Observable ao assinar.

O que são Creation Functions Condicionais?

Creation Functions Condicionais têm as seguintes funções:

  • Seleção Condicional: Selecionar diferentes Observables de acordo com as condições
  • Geração Atrasada: Criar dinamicamente um Observable no momento da assinatura

Ao contrário de outras Creation Functions, que criam e combinam Observables estaticamente, essas podem alterar seu comportamento com base em condições e estados de tempo de execução.

NOTE

Embora iif e defer tenham sido previamente classificados como "operadores condicionais", eles são Creation Functions (funções de criação Observable), não Pipeable Operators.

Principais Creation Functions Condicionais

FunçãoDescriçãoCasos de Uso
iifSelecionar um de dois Observables com base em uma condiçãoRamificação de processamento com base no status de login
deferAtrasar a geração de Observable no momento da assinaturaCriação dinâmica de Observable

Critérios de Uso

iif - Duas Ramificações Baseadas em Condição

iif seleciona um de dois Observables dependendo do resultado de uma função condicional. A condição é avaliada no momento da assinatura.

Sintaxe:

typescript
iif(
  () => condition,  // Função de condição (avaliada no momento da assinatura)
  trueObservable,   // Observable se verdadeiro
  falseObservable   // Observable se falso
)

Casos de Uso:

  • Ramificação de processamento com base no status de login
  • Alternância de processamento com base na existência de cache
  • Mudança de comportamento por variáveis de ambiente
typescript
import { iif, of } from 'rxjs';

const isAuthenticated = () => Math.random() > 0.5;

const data$ = iif(
  isAuthenticated,
  of('Dados autenticados'),
  of('Dados públicos')
);

data$.subscribe(console.log);
// Saída: 'Dados autenticados' ou 'Dados públicos' (dependendo da condição no momento da assinatura)

defer - Geração Atrasada no Momento da Assinatura

defer gera um Observable cada vez que ocorre uma assinatura. Isso permite que o Observable mude seu comportamento com base em seu estado no momento da assinatura.

Sintaxe:

typescript
defer(() => {
  // Executado no momento da assinatura
  return someObservable;
})

Casos de Uso:

  • Gerar Observable refletindo o estado mais recente no momento da assinatura
  • Gerar um valor aleatório diferente cada vez
  • Executar processamento diferente para cada assinatura
typescript
import { defer, of } from 'rxjs';

// Obter hora atual na assinatura
const timestamp$ = defer(() => of(new Date().toISOString()));

setTimeout(() => {
  timestamp$.subscribe(time => console.log('Primeiro:', time));
}, 1000);

setTimeout(() => {
  timestamp$.subscribe(time => console.log('Segundo:', time));
}, 2000);

// Saída:
// Primeiro: 2024-10-21T01:00:00.000Z
// Segundo: 2024-10-21T01:00:01.000Z
// ※Tempos diferentes são exibidos porque os horários de assinatura diferem

Diferença Entre iif e defer

Recursoiifdefer
EscolhaSelecionar de dois ObservablesGerar qualquer Observable
Temporização de AvaliaçãoAvaliar condição no momento da assinaturaExecutar função no momento da assinatura
PropósitoRamificação condicionalGeração dinâmica

Usando em Pipeline

Creation Functions Condicionais podem ser usadas em combinação com outros operadores.

typescript
import { defer, of } from 'rxjs';
import { switchMap } from 'rxjs';

// Obter informações do usuário do ID do usuário
const userId$ = of(123);

userId$.pipe(
  switchMap(id =>
    defer(() => {
      // Verificar cache mais recente no momento da assinatura
      const cached = cache.get(id);
      return cached ? of(cached) : fetchUser(id);
    })
  )
).subscribe(console.log);

Convertendo Cold para Hot

Conforme mostrado na tabela acima, todas as Creation Functions Condicionais geram Observables Cold. Avaliações condicionais e funções de geração são executadas cada vez que uma assinatura é feita.

Você pode converter um Observable Cold em um Observable Hot usando operadores multicast (share(), shareReplay(), etc.).

Exemplo Prático: Compartilhando Resultados de Ramificação Condicional

typescript
import { iif, of, interval } from 'rxjs';
import { take, share } from 'rxjs';

const condition = () => Math.random() > 0.5;

// ❄️ Cold - Reavaliar condição para cada assinatura
const coldIif$ = iif(
  condition,
  of('Condição é verdadeira'),
  interval(1000).pipe(take(3))
);

coldIif$.subscribe(val => console.log('Assinante 1:', val));
coldIif$.subscribe(val => console.log('Assinante 2:', val));
// → Cada assinante avalia independentemente a condição (possibilidade de resultados diferentes)

// 🔥 Hot - Compartilhar resultados de avaliação de condição entre assinantes
const hotIif$ = iif(
  condition,
  of('Condição é verdadeira'),
  interval(1000).pipe(take(3))
).pipe(share());

hotIif$.subscribe(val => console.log('Assinante 1:', val));
hotIif$.subscribe(val => console.log('Assinante 2:', val));
// → Condição avaliada apenas uma vez, resultados compartilhados

TIP

Para mais informações, consulte Criação Básica - Convertendo Cold para Hot.

Próximos Passos

Para aprender o comportamento detalhado e exemplos práticos de cada Creation Function, clique nos links da tabela acima.

Além disso, ao aprender Creation Functions de Combinação e Creation Functions de Seleção/Partição, você pode entender o panorama geral das Creation Functions.

Lançado sob a licença CC-BY-4.0.