Command Palette

Search for a command to run...

Promesas vs Observables: Concepto en JavaScript

Comprende las diferencias fundamentales entre promesas y observables. Aprende cuándo usar promesas (una vez) y cuándo usar observables (múltiples valores) según tu caso de uso.

Lectura: 10 min
Nivel: Avanzado

TL;DR - Resumen rápido

  • Las promesas resuelven UNA vez y entregan un valor único
  • Los observables pueden emitir múltiples valores a lo largo del tiempo
  • Las promesas son eager (ansiosas) mientras que los observables son lazy (perezosos)
  • Los observables pueden cancelarse, permitiendo limpiar recursos
  • Los observables requieren RxJS u otra librería (no son parte del estándar JavaScript)

Introducción a Promesas vs Observables

Promesas y observables son dos paradigmas diferentes para manejar valores asíncronos en JavaScript. Aunque ambos pueden parecer similares a primera vista, tienen diferencias fundamentales que los hacen adecuados para casos de uso completamente diferentes. Entender estas diferencias es crucial para elegir la herramienta correcta según tus necesidades.

Una promesa representa una operación asíncrona que eventualmente producirá UN valor único. Una vez resuelta o rechazada, la promesa no cambia de estado. Esto las hace ideales para operaciones que tienen un resultado final, como una petición HTTP o una consulta a base de datos.

Un observable, por otro lado, representa un flujo de valores que puede emitir múltiples valores a lo largo del tiempo. Los observables son más flexibles y permiten trabajar con streams de datos en tiempo real, donde los valores llegan de manera incremental. Esto los hace ideales para interfaces de usuario, actualizaciones en tiempo real, o eventos del sistema.

No es mejor ni peor

Ni las promesas ni los observables son mejores o peores. Cada uno tiene sus propias ventajas y casos de uso ideales. La elección depende de tu caso específico: si necesitas un valor único, usa promesas. Si necesitas múltiples valores o streams de datos, los observables son la mejor opción.

Promesas: Una Vez

Las promesas son el estándar en JavaScript para manejar operaciones asíncronas desde ES2015. Una promesa representa una operación que eventualmente se completará con un valor único, ya sea resuelta (éxito) o rechazada (error). Una vez que una promesa cambia de estado, no puede cambiar.

  • <strong>Un solo valor:</strong> Las promesas entregan un valor único cuando se completan.
  • <strong>Estado inmutable:</strong> Una vez resuelta o rechazada, el estado no cambia.
  • <strong>Eager:</strong> Las promesas son ansiosas y se ejecutan inmediatamente.
  • <strong>Encadenamiento:</strong> Puedes encadenar then() para manejar múltiples operaciones secuenciales.
  • <strong>Error handling:</strong> Usa catch() para capturar errores en promesas rechazadas.
  • <strong>Finalización:</strong> No hay forma de cancelar una promesa después de crearse.

Ejemplo de Promesa

Veamos un ejemplo práctico de cómo funciona una promesa en una operación típica de una aplicación web.

promesa-ejemplo.js
Loading code...

En este ejemplo, creamos una promesa que simula una petición HTTP. La promesa se resuelve después de 1000ms con los datos del usuario. Una vez resuelta, la promesa no puede cambiar de estado. Esto garantiza que el consumidor de la promesa siempre obtendrá el mismo valor, lo que las hace predecibles y fáciles de depurar.

Mejor práctica: Promesas para operaciones únicas

Usa promesas cuando necesitas un valor único y la operación no se repetirá. Las promesas son ideales para peticiones HTTP, consultas a bases de datos, o cualquier operación que tenga un resultado final determinado.

Observables: Múltiples Valores

Los observables son un patrón de diseño popularizado por la biblioteca RxJS. Un observable representa un flujo de valores que puede emitir múltiples valores a lo largo del tiempo, y los consumidores pueden suscribirse para recibir esos valores. Aunque hubo una propuesta TC39 para incluir observables en el estándar JavaScript, esta fue abandonada. Por lo tanto, para usar observables necesitas una librería como RxJS.

  • <strong>Múltiples valores:</strong> Los observables pueden emitir múltiples valores a lo largo del tiempo.
  • <strong>Lazy:</strong> Los observables no emiten valores hasta que alguien se suscribe.
  • <strong>Cancelación:</strong> Los observables pueden cancelarse, permitiendo limpiar recursos.
  • <strong>Streams:</strong> Los observables son ideales para streams de datos en tiempo real.
  • <strong>Operadores:</strong> RxJS proporciona operadores poderosos para transformar y combinar flujos de valores.
  • <strong>Librería externa:</strong> Los observables requieren RxJS u otra librería (no están en el estándar JavaScript).

Ejemplo de Observable

Veamos un ejemplo práctico de cómo funciona un observable para emitir múltiples valores a lo largo del tiempo, como en un contador que se actualiza cada segundo.

observable-ejemplo.js
Loading code...

En este ejemplo, creamos un observable que emite un valor incrementado cada segundo. Los consumidores pueden suscribirse en cualquier momento y recibirán todos los valores emitidos desde su suscripción. Esto demuestra cómo los observables son lazy (no emiten hasta que alguien se suscribe) y pueden emitir múltiples valores a lo largo del tiempo.

RxJS: La librería estándar para Observables

Este ejemplo usa RxJS, la librería más popular para trabajar con observables en JavaScript. Aunque hubo una propuesta para incluir observables en el estándar ECMAScript, esta fue abandonada. Por lo tanto, RxJS sigue siendo la opción recomendada para trabajar con observables, ofreciendo operadores poderosos y funcionalidades avanzadas para manejar streams de datos.

Diferencias Clave entre Promesas y Observables

Ahora que hemos visto ambos paradigmas, es importante entender las diferencias clave entre promesas y observables para poder elegir la herramienta correcta según tu caso de uso.

Tabla Comparativa

Esta tabla resume las diferencias clave entre promesas y observables, ayudándote a visualizar rápidamente cuándo usar cada paradigma.

comparacion-tabla.js
Loading code...

Esta tabla comparativa muestra las diferencias fundamentales entre promesas y observables. Observa cómo las promesas son ideales para operaciones con un resultado único, mientras que los observables son mejores para streams de datos y eventos en tiempo real. La elección depende de tu caso específico.

Elección según el caso de uso

Elige promesas para operaciones con un resultado único (peticiones HTTP, consultas a bases de datos). Elige observables para streams de datos en tiempo real, interfaces de usuario, o cuando necesites cancelación y control de flujo. No hay una respuesta universal - depende de tu caso específico.

Cuándo Usar Promesas vs Observables

Ahora que conocemos las diferencias clave entre promesas y observables, veamos cuándo usar cada uno según tu caso de uso específico. La elección correcta puede hacer la diferencia entre un código que funciona bien y uno que es difícil de mantener.

Casos de Uso para Promesas

Las promesas son ideales para casos donde necesitas un resultado único y la operación no se repetirá. Algunos ejemplos son: peticiones HTTP (fetch/axios), cargas de datos iniciales, validación de formularios antes de enviar, operaciones CRUD, o procesamiento de archivos. Las promesas garantizan que el consumidor siempre obtendrá el mismo valor, lo que las hace predecibles y fáciles de depurar.

Casos de Uso para Observables

Los observables son ideales para casos donde necesitas múltiples valores a lo largo del tiempo o streams de datos en tiempo real. Algunos ejemplos son: interfaces de usuario con actualizaciones en tiempo real (chats, notificaciones), streams de datos desde APIs, eventos del sistema (click, scroll, resize), formularios reactivos con binding bidireccional, o comunicaciones WebSocket. Los observables son perfectos para aplicaciones que requieren un flujo continuo de valores y la posibilidad de cancelar suscripciones.

Resumen: Promesas vs Observables

Conceptos principales:

  • Las promesas resuelven UNA vez y entregan un valor único
  • Los observables pueden emitir múltiples valores a lo largo del tiempo
  • Las promesas son eager (ansiosas) mientras que los observables son lazy (perezosos)
  • Las promesas no pueden cancelarse después de crearse
  • Los observables pueden cancelarse, permitiendo limpiar recursos
  • Los observables son ideales para streams de datos y eventos en tiempo real
  • Las promesas usan encadenamiento then/catch, los observables usan suscripción

Mejores prácticas:

  • Usa promesas para operaciones con un resultado único (peticiones HTTP, consultas a bases de datos)
  • Usa observables para streams de datos en tiempo real, interfaces de usuario, o eventos del sistema
  • Usa RxJS para trabajar con observables - es la librería estándar de facto en JavaScript
  • Siempre cancela las suscripciones a observables cuando ya no las necesites para evitar fugas de memoria
  • Elige la herramienta según tu caso específico: no hay una respuesta universal
  • Considera el costo de agregar RxJS como dependencia si solo necesitas promesas simples