Skip to content

Creation Functions básicas

Las Creation Functions más básicas y utilizadas con frecuencia. Cree fácilmente Observables basados en datos, arrays, eventos y tiempo.

¿Qué son las Creation Functions básicas?

Las Creation Functions básicas son funciones para crear un único Observable desde una variedad de fuentes de datos. Son el conjunto de funciones más fundamental en RxJS y se utilizan en casi todo el código RxJS.

Revise la tabla a continuación para ver las características y el uso de cada Creation Function.

Principales Creation Functions básicas

FunciónDescripciónCasos de uso
ofEmitir valores especificados en secuenciaPruebas con valores fijos, creación de mocks
fromConvertir desde array, Promise, etc.Streaming de datos existentes
fromEventConvertir eventos a ObservableEventos DOM, Node.js EventEmitter
intervalEmitir continuamente a intervalos especificadosPolling, ejecución periódica
timerComenzar a emitir después de un retrasoEjecución retardada, timeout

Criterios de uso

La elección de las Creation Functions básicas se determina por el tipo de fuente de datos.

1. Tipo de datos

  • Valores estáticos: of() - Crea un Observable especificando el valor directamente
  • Array o Iterable: from() - Convertir una colección existente en un stream
  • Promise: from() - Convertir procesamiento asíncrono a Observable
  • Evento: fromEvent() - Convierte un event listener a un Observable
  • Basado en tiempo: interval(), timer() - Emitir valores basados en el paso del tiempo

2. Tiempo de emisión

  • Emitir inmediatamente: of(), from() - Comenzar a emitir valores al suscribirse
  • Al ocurrir evento: fromEvent() - Emitir cuando ocurre un evento
  • Emitir periódicamente: interval() - Emitir continuamente a intervalos regulares
  • Emitir después de retraso: timer() - Comenzar a emitir después de un tiempo especificado

3. Tiempo de finalización

  • Completar inmediatamente: of(), from() - Completar después de que se emitan todos los valores
  • Nunca completar: fromEvent(), interval() - Continuar hasta unsubscribe
  • Emitir una vez y completar: timer(delay) - Completar después de emitir un valor

Ejemplos de uso práctico

of() - Pruebas con valores fijos

typescript
import { of } from 'rxjs';

// Crear datos de prueba
const mockUser$ = of({ id: 1, name: 'Usuario de prueba' });

mockUser$.subscribe(user => console.log(user));
// Salida: { id: 1, name: 'Usuario de prueba' }

from() - Streaming de un array

typescript
import { from } from 'rxjs';
import { map } from 'rxjs';

const numbers$ = from([1, 2, 3, 4, 5]);

numbers$.pipe(
  map(n => n * 2)
).subscribe(console.log);
// Salida: 2, 4, 6, 8, 10

fromEvent() - Evento de clic

typescript
import { fromEvent } from 'rxjs';

const clicks$ = fromEvent(document, 'click');

clicks$.subscribe(() => console.log('¡Botón clickeado!'));

interval() - Polling

typescript
import { interval } from 'rxjs';
import { switchMap } from 'rxjs';

// Polling de API cada 5 segundos
interval(5000).pipe(
  switchMap(() => fetchData())
).subscribe(data => console.log('Actualizado:', data));

timer() - Ejecución retardada

typescript
import { timer } from 'rxjs';

// Ejecutar después de 3 segundos
timer(3000).subscribe(() => console.log('3 segundos pasados'));

Cuidado con las fugas de memoria

La cancelación de suscripción adecuada es importante al usar las Creation Functions básicas.

WARNING

fromEvent(), interval() y timer(delay, period) periódico no completarán y siempre deben cancelarse con unsubscribe() o automáticamente con takeUntil() o similar cuando se destruye el componente.

Nota: timer(delay) sin segundo argumento completará automáticamente después de emitir una vez.

typescript
import { fromEvent, Subject } from 'rxjs';
import { takeUntil } from 'rxjs';

class MyComponent {
  private destroy$ = new Subject<void>();

  ngOnInit() {
    fromEvent(window, 'resize').pipe(
      takeUntil(this.destroy$)
    ).subscribe(() => console.log('Ventana redimensionada'));
  }

  ngOnDestroy() {
    this.destroy$.next();
    this.destroy$.complete();
  }
}

Conversión de Cold a Hot

Como se muestra en la tabla anterior, todas las Creation Functions básicas generan Cold Observables. Cada suscripción inicia una ejecución independiente.

Sin embargo, puede convertir un Cold Observable a un Hot Observable utilizando los siguientes operadores multicast.

Condiciones y operadores para conversión a Hot

OperadorComportamientoCasos de uso
share()Multicast + conexión/desconexión automáticaCompartir solicitudes HTTP entre múltiples suscriptores
shareReplay(n)Almacenar en caché los últimos n valores y entregar a nuevos suscriptoresAlmacenar en caché respuestas de API
publish() + connect()Iniciar multicast manualmenteIniciar ejecución cuando los suscriptores estén listos
multicast(subject)Multicast con Subject personalizadoCuando se necesita control avanzado

Ejemplo práctico

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

// ❄️ Cold - Temporizador independiente para cada suscripción
const cold$ = interval(1000).pipe(take(3));

cold$.subscribe(val => console.log('A:', val));
setTimeout(() => {
  cold$.subscribe(val => console.log('B:', val));
}, 1500);

// Salida:
// A: 0 (después de 0s)
// A: 1 (después de 1s)
// B: 0 (después de 1.5s) ← B comienza independientemente desde 0
// A: 2 (después de 2s)
// B: 1 (después de 2.5s)

// 🔥 Hot - Comparte temporizador entre suscriptores
const hot$ = interval(1000).pipe(take(3), share());

hot$.subscribe(val => console.log('A:', val));
setTimeout(() => {
  hot$.subscribe(val => console.log('B:', val));
}, 1500);

// Salida:
// A: 0 (después de 0s)
// A: 1 (después de 1s)
// A: 2, B: 2 (después de 2s) ← B se une a mitad de camino, recibe el mismo valor

TIP

Casos donde se requiere conversión Hot:

  • Quiere compartir una solicitud HTTP entre múltiples suscriptores
  • Quiere mantener solo una conexión WebSocket o de servidor
  • Quiere usar los resultados de cálculos de alto costo en múltiples ubicaciones

Para más información, consulte el capítulo Subject y Multicast (Capítulo 5).

Relación con Pipeable Operator

No existe un Pipeable Operator que corresponda directamente a las Creation Functions básicas. Siempre se utilizan como Creation Functions.

Sin embargo, se utilizan en combinación con Pipeable Operators en el siguiente patrón:

typescript
import { fromEvent } from 'rxjs';
import { debounceTime, switchMap } from 'rxjs';

// Entrada de usuario → Esperar 300ms → Llamada API
fromEvent(input, 'input').pipe(
  debounceTime(300),
  switchMap(event => fetchSuggestions(event.target.value))
).subscribe(suggestions => console.log(suggestions));

Próximos pasos

Para obtener más información sobre cómo funciona cada Creation Function y ejemplos prácticos, haga clic en los enlaces de la tabla anterior.

Además, al aprender Creation Functions de combinación, Creation Functions de selección/partición y Creation Functions condicionales, puede entender el panorama general de las Creation Functions.

Publicado bajo licencia CC-BY-4.0.