CodeForge

Angular 21 de Cero a Experto / RxJS y observables a gran escala

Observables: streams de valores en el tiempo

Teoría24 min20 XP

Las señales resuelven el estado; RxJS resuelve los EVENTOS en el tiempo: clics, pulsaciones de teclado, respuestas del servidor que llegan una tras otra, WebSockets. Un Observable es un "stream" —una secuencia de valores que llegan a lo largo del tiempo— y RxJS es el lenguaje para transformarlos y combinarlos. Ya viste la idea en el SC-02 (el store observable); hoy la formalizas con RxJS y construyes tu propio Observable desde cero.

El grifo, no el vaso

Observable vs Promise vs señal

Suscribirse a un Observable

Un Observable no hace nada hasta que te SUSCRIBES. Al suscribirte, le das tres manejadores: next (llegó un valor), error (algo falló, termina), complete (terminó sin error):

subscribe.ts
import { interval } from 'rxjs';

// 'interval' emite 0, 1, 2, 3… cada 1000ms
const sub = interval(1000).subscribe({
next: (n) => console.log('tick', n),   // se llama en cada emisión
error: (e) => console.error(e),        // si falla
complete: () => console.log('fin'),    // si termina
});

// cuando ya no lo necesitas, te DESUSCRIBES (cierras el grifo)
sub.unsubscribe();

La suscripción devuelve un objeto con .unsubscribe(): cerrar el grifo es tu responsabilidad, o tendrás fugas (un interval que sigue corriendo tras destruir el componente). En Angular, el async pipe y toSignal gestionan esto por ti —una de las razones para preferirlos sobre subscribe manual—.

De dónde vienen los Observables

Casi todo lo asíncrono en Angular es un Observable:

fuentes.ts
this.http.get<Gasto[]>('/api/gastos');    // HttpClient → Observable de la respuesta
this.form.valueChanges;                    // cambios del formulario → Observable
this.route.paramMap;                        // parámetros de la URL → Observable
fromEvent(boton, 'click');                  // eventos del DOM → Observable
// y creas los tuyos con of(...), from(...), interval(...), new Observable(...)

Construye tu propio Observable

Un Observable no es magia: es una función que, cuando alguien se suscribe, empieza a EMPUJAR valores al suscriptor. Aquí está la esencia —un mini-Observable con subscribe, unsubscribe, next y complete— en vivo:

Fíjate en dos cosas: (1) el productor solo arranca al subscribe —los Observables son PEREZOSOS, a diferencia de una Promise que corre al crearse—; (2) unsubscribe llama a la función de limpieza (clearInterval), cerrando el grifo. Ese es el contrato de RxJS: te suscribes para recibir, te desuscribes para parar. Todo lo demás —operadores, combinaciones— se construye encima de esto.

¿Cuál es la diferencia clave entre una Promise y un Observable?

Mini-reto

En el playground, amplía tu mini-RxJS: 1) una función deRango(inicio, fin) que emita los números de inicio a fin y complete; 2) suscríbete e imprime cada valor; 3) crea un cadaTick que se cancele SOLO tras 5 emisiones (lleva la cuenta en el next y llama unsubscribe). Confirma que sin subscribe no se imprime nada (pereza).

Qué sigue

Tienes el ladrillo: un stream al que te suscribes. Pero el poder de RxJS está en TRANSFORMAR ese stream antes de consumirlo: mapear, filtrar, esperar a que el usuario deje de escribir. La próxima lección son los operadores y el pipe —la tubería que transforma un grifo en otro—.