En este momento estás viendo Callbacks en JavaScript

Callbacks en JavaScript

Los Callbacks en JavaScript son como su propio nombre, en inglés, indica, llamadas de vuelta, quiere decir que cuando invoco una función pasándole como parámetro otra función (el callback) esta función parámetro se ejecuta cuando la función principal ha terminado de ejecutarse. O cuando a nosotros nos interese…

Este concepto que parece muy complicado, es en realidad muy sencillo de entender si lo hacemos con casos prácticos, por ejemplo:

function funcionPrincipal(callback){
 alert('hago algo y llamo al callback avisando que terminé');
 callback();
}

funcionPrincipal(function(){
 alert('terminó de hacer algo');
});

Aquí vemos como la función funcionPrincipal se ejecuta recibiendo un argumento que es otra función y que se ejecuta después de que termine su labor llamando a callback.

Pero no te preocupes si no lo has entendido, vamos a hacer algunos ejemplos más para ir cogiéndolo, en realidad es muy sencillo.



Siguiendo con el caso anterior, podemos hacer incluso que la función callback reciba argumentos que se envían desde la función principal…

function funcionPrincipal(callback){
    alert('hago algo y llamo al callback avisando que terminé');
    callback('Miguel');
}

funcionPrincipal(function(nombre){
   alert('me llamo ' + nombre);
});

Con esto ya vemos la fuerza que puede tener esta forma de programación, pero ahora imaginemos que queremos encadenar diferentes funciones con callbacks, lo cual es muy sencillo siguiendo con la misma lógica…

function funcionPrincipal(callback1, callback2, callback3){
    //código de la función principal
    callback1();
    //más código de la función principal
    callback2();
    //más código de la función principal
    callback3();
    //más código si fuera necesario
}

funcionPrincipal(
	function(){
   		alert('primer callback');
	},
	function(){
		alert('segundo callback');
	},
	function(){
		alert('tercer callback');
	}
);

Aquí vemos como al invocar a la función principal se le pasan como argumentos las tres funciones, que se ejecutan, las cuales podrían recibir parámetros… como hemos visto más arriba, pero de este modo el código queda un poco sucio, ya que no podemos ver claramente las funciones, de modo que podemos declarar las funciones que se enviarán como argumentos aparte, lo cual nos permite también utilizarlas en otras partes del código, tal y como vemos en el siguiente ejemplo:

function funcionPrincipal(callback1, callback2, callback3){
    //código de la función principal
    callback1();
    //más código de la función principal
    callback2();
    //más código de la función principal
    callback3();
    //más código si fuera necesario
}

function callback1(){
   		alert('primer callback');
	}

function callback2(){
		alert('segundo callback');
	}

function callback3(){
		alert('tercer callback');
	}	

funcionPrincipal(callback1, callback2, callback3);

Podemos observar cómo se declaran todas funciones y luego se pasan como argumentos de la función principal para poder utilizarlas dentro de la misma. Pero aunque esto daría para otra entrada, vamos a ver por encima el uso de otra función de javaScript llamada setInterval(), esta función nos sirve para retardar acciones, y necesita dos parámetros para funciones; una función que invoca a la función que vamos a usar y un valor numérico que dice en milisegundos el retraso y actualización de la función invocada.




Esto que parece un lío, vamos a verlo en un código donde mostraremos un alert, un reloj y un texto, y donde el reloj se va modificando cada segundo y el texto tardará en aparecer 3 segundos:

<h3 id="demo"></h3>
<h3 id="demo2"></h3>
<script>
function funcionPrincipal(callback1, callback2, callback3){
    //código de la función principal
    callback1();
    //más código de la función principal
    var miVar = setInterval(function(){ callback2() }, 1000);
    //más código de la función principal
    var miVar2 = setInterval(function(){ callback3() }, 3000);
    //más código si fuera necesario
}

function callback1(){
   		alert('primer callback');
	}

function callback2(){
	    var d = new Date();
	    var t = d.toLocaleTimeString();
	    document.getElementById("demo").innerHTML = t;	
	}

function callback3(){
		document.getElementById("demo2").innerHTML = 'Esto es el callback3';
	}	

funcionPrincipal(callback1, callback2, callback3);
</script>

El ejemplo en esencia es el mismo, cambiando las funcionalidades de las funciones de callback, pero hemos añadido en las líneas 8 y 10 la función setInterval() para que se retrasen e incluso se actualice, aprovechando de paso la forma de hacer un reloj en javascript…

Con esto tenemos ya los conocimientos básicos para entender los callbacks en javascript y llegar a usarlos cuando nos veamos en la necesidad.



Esta entrada tiene 14 comentarios

  1. Maria

    Tienes novia?

    1. Miguel Angel

      jajajaja ¿en serio? jajaja
      no, no tengo XD

  2. Alberto Vargas

    HOLA MIGUEL:

    function fPedirCoti(wId){
    document.getElementById(‘iPedir’).disabled = true;
    document.getElementById(‘iPedir’).style.cursor = ‘wait’;
    document.getElementById(‘iPedir’).style.color = ‘#b7b7b9’;

    // ACTUALIZO EL PEDIDO EN LA TABLA DE PEDIDOS
    pwcRecargar(‘PWCPedirCoti2.php’,’#iPedir1′,wId);
    // LIMPIO LAS CAJAS CON DATOS
    fLimpia();
    // ENVIO LA FORMA
    document.getElementById(«iFrmCotiza»).submit();
    }

    // MANDO LLAMAR ESTA FUNCION CON:
    <input name="nPedir" id="iPedir" class="cBtn1" onclick="this.disabled=true;fPedirCoti('’)» type=»button» value=»Levantar pedido» tabindex=»-1″ title=»Enviar Cotización a ERP (Levartar pedido)» disabled />

    COMO PODRIA CORRER PRIMERO pwcRecargar(), DESPUES DE QUE TERMINO fLimpia() Y TERMINANDO ESTA, EL SUBMIT ?

    PORQUE AL PARECER NO ME SIGUE ESTE ORDEN DE EJECUCION Y ESO ME CREA EL CONFLICTO DE QUE ME MUESTRE POR EJEMPLO 3 ARTICULOS EN VEZ DE 10 QUE ESTOY INSERTANDO EN EL MOMENTO.

    ESPERO HABERME EXPLICADO CORRECTAMENTE Y PUEDAS AYUDARME

    GRACIAS

    1. Miguel Angel

      Hola, ante todo perdón por el retraso, ultimamente no he tenido mucho tiempo de estar con el blog ni con apenas nada, ando con problemas de salud familiar y cambiando de trabajo.
      No obstante en tu código no ve que uses los callbacks, JavaScript por defecto va a intentar ejecutarlo todo a la vez y por eso te da los errores, con los callbacks lo que haces es que algo no se ejecute hasta que lo anterior no haya terminado.
      De este modo tu deberias de hacer un callback desde pwcRecargar a fLimpia y de este otro a que se realice el submit…
      En el siguiente enlace te dejo un código muy bueno que te puede iluminar en tu proyecto:
      Ejemplo de callbacks anidados
      Espero que te sirva de ayuda.

  3. Mateo

    Gracias me sirvió para entender.
    Igual queda mas claro si escribis las lineas 8 y 10 de la siguiente forma:

    var miVar = setInterval(callback2(), 1000);
    //más código de la función principal
    var miVar2 = setInterval(callback3(), 3000);
    //más código si fuera necesario

    (sin las function{ } )
    Muchas gracias!

    1. Miguel Angel

      es otra forma de presentarlo, si te ha venido mejor así también puedes hacerlo, según la situación, necesidades y estilo se puede hacer de muchas formas.
      Gracias por comentar 🙂

  4. Richar Pupo

    Muchisimas gracias amigo, estaba viendo un curso sobre NODE y el tema de los callback no me quedaba claro, incluso con la documentación de Mozilla. Gracias a ti me quedo clarísimo el concepto.

    1. Miguel Angel

      Me alegro muchísimo de que te haya servido.

  5. Miguel Espeso

    Buen articulo, me quedo mas claro los callback.
    ¿ Tienes alguno de Generadores… ???
    Con tus buenas explicaciones , seguro que llego a terminar de entenderlo.
    Gracias

    1. miguel

      Muchas gracias por tu comentario, me alegro que te haya servido pero por desgracia de generadores no tengo nada, lo siento…

  6. cristian

    buen post amigo aca tratando de comprender los callbacks y aparte la invocacion a funciones con la nomenclatura => me tienen hecho un enredo, tienes por casualidad info de ese tipo ?

    1. miguel

      Con eso ya te estas metiendo en objetos…

Deja una respuesta

Responsable » Miguel Ángel López Torralba
Finalidad » Contactar conmigo y enviarte mi contenido.
Legitimación » Tu consentimiento.
Destinatario » MailChimp, mi proveedor de email marketing, que está acogido al acuerdo de seguridad EU-US Privacy.
Derechos » Acceder, rectificar, limitar o suprimir tus datos cuando quieras.