Command Palette

Search for a command to run...

Promise Chaining: Encadenar Promesas en JavaScript

Domina el encadenamiento de promesas para ejecutar operaciones asíncronas en secuencia de manera elegante y legible.

Lectura: 10 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • Promise chaining permite ejecutar operaciones asíncronas en secuencia
  • then() puede retornar cualquier valor: primitivo, objeto o promesa
  • JavaScript envuelve automáticamente valores no-promesa en Promise.resolve()
  • Los errores se propagan hacia abajo en la cadena de promesas
  • Un solo catch() al final puede manejar errores de toda la cadena

Introducción al Promise Chaining

El Promise Chaining (encadenamiento de promesas) es una técnica que te permite ejecutar múltiples operaciones asíncronas en secuencia de manera elegante y legible. En lugar de anidar callbacks profundamente (lo que causa el infame "Callback Hell"), cada then() retorna una nueva promesa con el valor transformado, creando una cadena plana de operaciones asíncronas.

El encadenamiento de promesas es posible porque el método then() de una promesa retorna otra promesa. Esto te permite pasar el resultado de una operación asíncrona a la siguiente, transformarlo o usarlo para iniciar otra operación. El resultado final de la cadena está disponible en el último then() o en uncatch() si hay errores.

¿Por qué es importante?

El Promise Chaining es la base de async/await, la sintaxis más moderna y legible para código asíncrono. Entender cómo funciona el chaining es esencial para dominar async/await y escribir código asíncrono más mantenible.

¿Qué es Promise Chaining?

El Promise Chaining es el proceso de conectar múltiples promesas usando el métodothen(). Cada promesa tiene un método then() que acepta dos callbacks: uno para el caso de éxito y otro opcional para el caso de error. Cuando llamas a then(), JavaScript crea automáticamente una nueva promesa encadenada que se resuelve con el valor que retornes del callback.

Beneficios del Chaining

El encadenamiento de promesas ofrece varios beneficios importantes comparado con los callbacks tradicionales. El más obvio es que elimina el Callback Hell, pero también proporciona mejor manejo de errores, transformación de valores y código más legible y mantenible.

  • <strong>Elimina Callback Hell</strong>: Código plano en lugar de anidaciones profundas
  • <strong>Manejo unificado de errores</strong>: Un solo catch() maneja todos los errores
  • <strong>Transformación de valores</strong>: Cada then() puede transformar el resultado anterior
  • <strong>Secuencialidad garantizada</strong>: Las operaciones se ejecutan en orden
  • <strong>Legibilidad mejorada</strong>: Código más fácil de leer y mantener

Encadenar Básico

Para encadenar promesas, simplemente llamas a then() y retornas una nueva promesa desde el callback. El valor que retornes estará disponible en el siguientethen() de la cadena. Puedes encadenar tantas promesas como necesites, creando una cadena de operaciones asíncronas que se ejecutan en secuencia.

Transformar Valores

Una de las características más poderosas del Promise Chaining es la capacidad de transformar valores entre cada then() de la cadena. Puedes modificar, filtrar o procesar el resultado de una promesa antes de pasarlo a la siguiente. Esto te permite crear pipelines de procesamiento de datos asíncronos.

encadenar-basico.js
Loading code...

Este ejemplo muestra cómo encadenar promesas para obtener y transformar datos. Primero obtenemos el usuario, luego sus posts, y finalmente extraemos los comentarios de cada post. Cada then() recibe el valor del anterior, lo que permite pasar datos de una operación a la siguiente de manera plana.

Transformación de Valores

La transformación de valores en cada then() es una de las características más poderosas del Promise Chaining. Te permite crear pipelines de procesamiento de datos asíncronos, donde cada paso transforma los datos antes de pasarlos al siguiente.

Propagación de Errores

En el Promise Chaining, los errores se propagan automáticamente hacia abajo en la cadena de promesas. Esto significa que un solo catch() al final de la cadena puede capturar errores de cualquier then() anterior. Esta es una ventaja significativa comparado con los callbacks, donde cada callback necesita su propio manejo de errores.

propagacion-errores.js
Loading code...

Este ejemplo muestra cómo se propagan los errores en el Promise Chaining. Si la promesa del usuario se rechaza, el error se propaga automáticamente al catch() al final. Los then() intermedios no se ejecutan cuando hay un error, lo que garantiza que el código no continúe con datos inválidos.

Advertencia de Error Propagation

Los errores en el Promise Chaining se propagan inmediatamente. Si una promesa se rechaza, todos los then() subsiguientes se saltan. Siempre incluye un catch() al final de tu cadena para manejar errores de toda la cadena.

Errores Comunes con Promise Chaining

El error más común en Promise Chaining es olvidar el return. Cuando olvidas retornar una promesa desde then(), el siguiente then() se ejecuta inmediatamente con undefined, sin esperar a que la operación asíncrona termine.

Error: Olvidar el Return

Olvidar el return es el error más común en Promise Chaining. Si no retornas la promesa, el siguiente then() no espera a que la operación asíncrona termine y se ejecuta inmediatamente con undefined. Esto rompe la secuencialidad de la cadena y causa que el código se ejecute en orden incorrecto.

error-olvidar-return.js
Loading code...

Este ejemplo muestra el error de olvidar el return. Sin el return,obtenerPosts se ejecuta pero su promesa no se pasa al siguientethen(). El segundo then() se ejecuta inmediatamente conundefined, sin esperar a que los posts se obtengan. La solución es simple: siempre agregar return antes de llamar a funciones que retornan promesas.

then() acepta cualquier valor

Puedes retornar **cualquier valor** desde then(): primitivos, objetos, arrays, o promesas. JavaScript automáticamente envuelve valores no-promesa enPromise.resolve(valor). Si retornas una promesa, then()espera a que se resuelva. No necesitas envolver valores manualmente enPromise.resolve() a menos que ya tengas una promesa.

Resumen: Promise Chaining

Conceptos principales:

  • Promise chaining permite ejecutar operaciones asíncronas en secuencia
  • then() puede retornar cualquier valor: primitivo, objeto o promesa
  • JavaScript envuelve automáticamente valores no-promesa en Promise.resolve()
  • Los errores se propagan hacia abajo en la cadena de promesas
  • Un solo catch() al final maneja errores de toda la cadena

Mejores prácticas:

  • Siempre usa return antes de llamar funciones que retornan promesas
  • Puedes retornar valores primitivos desde then(), no necesitas Promise.resolve()
  • Usa catch() al final para manejar errores de toda la cadena
  • Transforma valores en cada then() según necesites
  • Usa async/await para código aún más legible