Command Palette

Search for a command to run...

Callbacks y Funciones de Orden Superior

Descubre cómo funcionan los callbacks, las funciones de orden superior, cómo usarlos para escribir código más expresivo, y cómo evitar el callback hell con promesas y async/await.

Lectura: 12 min
Nivel: Principiante

TL;DR - Resumen rápido

  • Callback: función pasada como argumento a otra función
  • Función de orden superior: acepta o retorna funciones
  • Callbacks asíncronos: ejecutan después de una operación asíncrona
  • Callbacks síncronos: ejecutan inmediatamente dentro de la función
  • Callback hell: anidamiento excesivo de callbacks
  • Métodos de array: map, filter, reduce usan callbacks

¿Qué son los callbacks?

Un callback es una función que se pasa como argumento a otra función y se ejecuta después de que ocurra un evento o se complete una operación. Los callbacks son fundamentales en JavaScript para programación asíncrona y son la base de patrones como eventos, promesas y async/await.

Los callbacks existen porque las funciones son ciudadanos de primera clase en JavaScript, lo que significa que pueden ser pasadas como valores. Esta característica permite crear código más flexible y reutilizable, donde el comportamiento puede ser personalizado pasando diferentes callbacks.

que-son-callbacks.js
Loading code...

El ejemplo muestra un callback básico. La función procesarDatos acepta datos y un callback, procesa los datos, y luego invoca el callback con el resultado. El callback mostrarResultado se pasa como argumento y se ejecuta después de que procesarDatos termina.

Ciudadanos de primera clase

Los callbacks son posibles porque las funciones son ciudadanos de primera clase en JavaScript. Pueden ser asignadas a variables, pasadas como argumentos, y retornadas desde otras funciones.

Funciones de orden superior

Una función de orden superior (higher-order function) es una función que acepta otra función como argumento o retorna una función. Las funciones de orden superior son fundamentales para la programación funcional en JavaScript y son la base de patrones como map, filter y reduce.

funciones-orden-superior.js
Loading code...

El ejemplo muestra funciones de orden superior en acción. ejecutarDosVeces acepta un callback y lo ejecuta dos veces. crearMultiplicador acepta un número y retorna una nueva función que multiplica por ese número. Ambas son funciones de orden superior porque operan sobre otras funciones.

  • <strong>Aceptan funciones:</strong> Funciones que toman callbacks como argumentos
  • <strong>Retornan funciones:</strong> Funciones que crean y retornan nuevas funciones
  • <strong>Programación funcional:</strong> Base de patrones funcionales
  • <strong>Reutilización:</strong> Permite crear código más reutilizable
  • <strong>Abstracción:</strong> Oculta complejidad detrás de funciones genéricas

Métodos de array

Los métodos de array como map, filter y reduce son funciones de orden superior que aceptan callbacks. Son la forma más común de usar callbacks en JavaScript moderno.

Callbacks asíncronos

Los callbacks asíncronos se ejecutan después de que se complete una operación asíncrona como una petición HTTP, un temporizador, o una operación de archivo. Los callbacks asíncronos son fundamentales para JavaScript, que es single-threaded y usa el event loop para manejar operaciones asíncronas.

callbacks-asincronos.js
Loading code...

El ejemplo muestra callbacks asíncronos con setTimeout y fetch. Los callbacks se ejecutan después de que el temporizador expire o la petición HTTP se complete. Los callbacks asíncronos son esenciales para operaciones que toman tiempo sin bloquear el hilo principal.

JavaScript usa el event loop para manejar operaciones asíncronas, permitiendo que los callbacks asíncronos no bloqueen el hilo principal. setTimeout ejecuta el callback después de un retraso especificado, mientras que fetch ejecuta el callback cuando la petición HTTP se completa. Los event listeners también usan callbacks asíncronos, ejecutándolos cuando ocurren eventos específicos como clicks, scroll o load. Este modelo no bloqueante es fundamental para mantener la interfaz de usuario responsiva.

Async/await como alternativa

Las promesas y async/await son alternativas modernas a los callbacks asíncronos. Proporcionan una sintaxis más clara y evitan el callback hell, aunque internamente usan callbacks.

Callbacks síncronos

Los callbacks síncronos se ejecutan inmediatamente dentro de la función que los invoca, sin esperar por operaciones asíncronas. Los callbacks síncronos son comunes en métodos de array como map, filter y reduce, y en funciones de orden superior que procesan datos.

callbacks-sincronos.js
Loading code...

El ejemplo muestra callbacks síncronos con map y filter. Los callbacks se ejecutan inmediatamente para cada elemento del array, sin esperar por operaciones asíncronas. Los callbacks síncronos son ideales para procesamiento de datos y transformaciones.

Los callbacks síncronos se ejecutan inmediatamente dentro de la función que los invoca, lo que los hace ideales para procesamiento de datos y transformaciones de arrays. Métodos como map, filter y reduce usan callbacks síncronos que se ejecutan en orden predecible. A diferencia de los callbacks asíncronos, los callbacks síncronos no dependen del event loop, ejecutándose secuencialmente en el hilo principal. Esto garantiza que el orden de ejecución sea completamente predecible y determinista.

Programación funcional

Los callbacks síncronos son la base de la programación funcional en JavaScript. Métodos como map, filter y reduce permiten escribir código declarativo y expresivo.

Callback Hell

El callback hell (o pirámide de doom) es el problema de anidar excesivamente callbacks, creando código difícil de leer y mantener. Ocurre cuando necesitas ejecutar múltiples operaciones asíncronas en secuencia, cada una dependiendo del resultado de la anterior.

callback-hell.js
Loading code...

El ejemplo muestra el callback hell en acción. Cada operación asíncrona depende del resultado de la anterior, creando una pirámide de callbacks anidados. Este código es difícil de leer, mantener y debuggear. Las promesas y async/await son soluciones modernas a este problema.

El callback hell se caracteriza por callbacks anidados en muchos niveles, creando una estructura piramidal confusa y difícil de leer. Los cambios en este código son complicados porque modificar un nivel puede requerir ajustes en todos los niveles anidados. El manejo de errores también es complejo, ya que cada nivel necesita su propio error handling. Las soluciones modernas incluyen promesas con .then() y async/await, que permiten escribir código asíncrono que se lee de forma lineal, eliminando la pirámide de callbacks y mejorando significativamente la legibilidad y mantenibilidad.

Async/await como solución

Async/await es la solución moderna al callback hell. Permite escribir código asíncrono que se lee como código síncrono, eliminando la pirámide de callbacks y mejorando la legibilidad.

Métodos de array como callbacks

Los métodos de array como map, filter, reduce, forEach, some y every son ejemplos clásicos de funciones de orden superior que aceptan callbacks. Estos métodos son fundamentales para procesamiento de datos en JavaScript y permiten escribir código más declarativo.

metodos-array.js
Loading code...

El ejemplo muestra varios métodos de array que usan callbacks. map transforma cada elemento, filter selecciona elementos que cumplen una condición, y reduce combina todos los elementos en un solo valor. Estos métodos son más expresivos y legibles que usar bucles for.

  1. <strong>map:</strong> Transforma cada elemento del array
  2. <strong>filter:</strong> Selecciona elementos que cumplen una condición
  3. <strong>reduce:</strong> Combina elementos en un solo valor
  4. <strong>forEach:</strong> Ejecuta callback para cada elemento
  5. <strong>some/every:</strong> Verifica si algunos/todos elementos cumplen condición

Código declarativo

Los métodos de array permiten escribir código más declarativo. En lugar de describir CÓMO iterar (for), describes QUÉ quieres hacer (map, filter), lo que es más legible y menos propenso a errores.

Resumen

Resumen: Callbacks y Funciones de Orden Superior

Conceptos principales:

  • Callback: función pasada como argumento a otra función
  • Función de orden superior: acepta o retorna funciones
  • Callbacks asíncronos: ejecutan después de operaciones asíncronas
  • Callbacks síncronos: ejecutan inmediatamente
  • Callback hell: anidamiento excesivo de callbacks
  • Métodos de array: map, filter, reduce usan callbacks

Mejores prácticas:

  • Usa métodos de array para procesamiento de datos
  • Prefiere async/await sobre callbacks anidados
  • Usa callbacks síncronos para transformaciones
  • Evita el callback hell con promesas
  • Escribe funciones de orden superior reutilizables
  • Usa callbacks para personalizar comportamiento