¿Qué es un callback y para qué sirve?
Ver respuesta — intenta responderla en voz alta primero
Un callback es una función que se pasa como argumento a otra función para que esta pueda ejecutarla más tarde. Se usa mucho en operaciones asíncronas y en métodos de arreglos como map o filter.
En JavaScript, las funciones son valores: puedes guardarlas en variables y pasarlas como argumentos. Cuando pasas una función a otra función para que la "llame de vuelta" en algún momento, esa función pasada es un callback.
Se usan en dos grandes contextos:
- Síncrono: métodos como
map,filteryforEachreciben un callback que se ejecuta por cada elemento. - Asíncrono: operaciones como
setTimeouto las peticiones a un servidor reciben un callback que se ejecuta cuando la tarea termina.
// Callback síncrono: se ejecuta por cada elemento
const numeros = [1, 2, 3];
numeros.forEach(function (n) {
console.log(n * 2); // 2, 4, 6
});
// Pasar una función definida como callback
function saludar(nombre) {
console.log("Hola " + nombre);
}
function procesar(nombre, callback) {
callback(nombre); // aquí "llama de vuelta"
}
procesar("Mike", saludar); // "Hola Mike"
// Callback asíncrono
setTimeout(function () {
console.log("Esto se ejecuta después");
}, 1000);
- Llamar al callback en lugar de pasarlo: escribir
procesar(saludar())en vez deprocesar(saludar). Con paréntesis lo ejecutas de inmediato y pasas su resultado; sin paréntesis pasas la función en sí. - Callback hell: anidar muchos callbacks asíncronos crea código difícil de leer. Para eso existen las promesas y
async/await.
"Un callback es una función que le paso a otra función como argumento para que la ejecute cuando lo necesite. Los uso todo el tiempo con métodos de arreglos como
mapofilter, donde el callback se ejecuta por cada elemento, y también en código asíncrono comosetTimeout. Un detalle importante es pasar la función sin paréntesis, porque con paréntesis la ejecuto en lugar de pasarla."
Escribe una función repetir(n, callback) que llame al callback n veces, pasándole el número de repetición actual (empezando en 1).
Ver solución
function repetir(n, callback) {
for (let i = 1; i <= n; i++) {
callback(i);
}
}
repetir(3, (i) => console.log("Repetición " + i));
// Repetición 1
// Repetición 2
// Repetición 3