javascript

Callbacks, código asíncrono y funciones anónimas en Javascript

Introducción

En el mundo de Javascript normalmente nos encontraremos con algunas cosas que no entenderemos bien y que, de no hacerlo, las cosas más avanzadas nos serán más difíciles de entender. Por eso en este post explicaré un poco 3 cosas básicas que debemos saber al programar en este fabuloso lenguaje.

Una analogía a los callbacks y el código asíncrono es la siguiente:

Imaginemos que fuimos a la casa de un amigo y dejamos las llaves de nuestra habitación en su casa. Así que lo llamamos por teléfono y le decimos que por favor busque la llave. Pero en lugar de esperar a que las encuentre, terminamos la llamada y le pedimos que cuando las encuentre nos llame. Así, mientras él busca, nosotros podemos dedicarnos a otras cosas.

Después de unos minutos u horas, el amigo nos llamará y nos dirá que las encontró. Pero en ese tiempo transcurrido nosotros habremos hecho otras cosas productivas, en lugar de quedarnos pegados al teléfono mientras él buscaba.

El callback en este caso sería cuando nuestro amigo nos llama de vuelta con los datos de la búsqueda de las llaves. El código asíncrono es que no nos quedamos quietos esperando a que terminara, sino que hicimos otras cosas y esperamos su llamada.

Funciones

Las funciones en Javascript se comportan como las funciones en todos los lenguajes de programación. Reciben argumentos, procesan y regresan lo procesado. A veces no reciben argumentos, y a veces no regresan nada.

Por ejemplo, aquí tenemos una función que suma dos números:

function sumar(numero, otroNumero){
  return numero + otroNumero;
}

Funciones anónimas

Las funciones anónimas, como su nombre lo indica, no tienen nombre. Y normalmente son usadas sólo una vez en nuestro código. Por ejemplo, al hacer una petición AJAX usando jQuery podemos usar algo así:

$.get("archivo.php", function(respuesta){
  //Aquí manejar la respuesta
});

Fijémonos en la parte en donde dice function(respuesta). La función no tiene nombre, pero ahí está.  Sólo indica que recibirá la respuesta como argumento. No le pusimos nombre porque no es necesario, ya que sólo será usada una vez para manejar esta respuesta específica.

La función sumarNumeros puede que la utilicemos en otra parte de nuestro programa, así que le pusimos nombre para llamarla cuando queramos, las veces que sean necesarias; pero para cosas específicas podemos usar una anónima.

Aunque si queremos, podemos definir una función con nombre, así:

$.get("archivo.php", manejarRespuesta);
 
function manejarRespuesta(respuesta){
  //Aquí manejar la respuesta
}

La desventaja es que, si hacemos muchas peticiones no vamos a estar definiendo muchas funciones para cada respuesta, ya que sería engorroso. Por eso se usa una función anónima, ya que sólo se llamará una vez.

Código asíncrono

En Javascript, tanto del lado del cliente como del servidor, se usa el código asíncrono. ¿Por qué?

Bueno, veamos otra vez la petición AJAX de arriba:

$.get("archivo.php", function(respuesta){
  //Aquí manejar la respuesta
});

Estamos llamando a archivo.php. Lo normal sería poner algo así:

var misDatos = $.get("archivo.php", function(respuesta){
  return respuesta;
});

Lo que haría ese código sería pedirle al servidor el archivo y esperar a que regresara. Una vez que regresara, le asignamos eso a la variable.

Pues eso no es posible, aunque tal vez muchos quisiéramos que fuera así. La razón por la que no es posible es porque mientras se espera la respuesta del servidor, la interfaz quedará pausada o congelada. Es decir, se hace la petición, y el usuario no podrá hacer click en ningún botón, ni escribir en un input; nada. Cuando el servidor responda la petición AJAX, todo se descongelará. Pero no sabemos a ciencia cierta a qué hora el servidor responderá.

Pueden pasar muchas cosas; por ejemplo, que el servidor esté ocupado atendiendo a otros clientes. O que se caiga, o cosas así. Nunca debemos confiar en que el servidor responderá al instante, por más rápido que éste sea.

Así que mejor lo hacemos asíncrono. Le pedimos el archivo al servidor, y le decimos a Javascript: “Oye, cuando el servidor responda, avísame”.

Mientras el servidor responde, Javascript procesa otro código, escucha clicks de botones, y hace cualquier operación.

Si el servidor responde después de 1 minuto esto no importa, ya que la interfaz no se quedó congelada.

Callbacks

Los callbacks son funciones que se ejecutan cuando un proceso asíncrono ha terminado (en error o en éxito, pero terminado).

Nuevamente veamos la función AJAX de arriba:

$.get("archivo.php", function(respuesta){
  //Aquí manejar la respuesta
});

Podemos ver que definimos una función anónima. Pues bien, lo que hacemos es decirle a Javascript que nos llame de vuelta cuando reciba la respuesta del servidor. ¿A quién llamará? pues a la función anónima que definimos.

Dentro de la función ya podemos trabajar con los datos. No sabemos a ciencia cierta cuándo será llamada dicha función, pero sí sabemos programarla para que procese los datos una vez que éstos sean devueltos.

Conclusión

Las funciones asíncronas no sólo son usadas con peticiones AJAX. Por ejemplo, también son usadas en Javascript del lado del servidor. Algunos ejemplos son:

  • Leer archivos: le decimos a Javascript que lea un fichero del disco duro, y que nos llame cuando haya terminado. Mientras tanto, podemos atender otras peticiones de los clientes.
  • Interactuar con bases de datos: guardar o manipular datos y esperar a que nos llamen de vuelta en lugar de estar esperando. Mientras esperamos la llamada, podemos atender otras cosas

Por cierto, cabe mencionar que los callbacks ya están en desuso y están siendo remplazados por promesas o por async y await, pero eso es otra historia. Además, si entendemos el código asíncrono no nos costará entender las demás cosas.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Entonces, el código con Callback sería:
    var misDatos;
    $.get("archivo.php", function(respuesta){
    misDatos = return respuesta;
    });
    usar_midDatos(misDatos);

    Si es correcto, deberías añadirlo al final de tu post, porque tu último código de ejemplo, idéntico al primero, no lo deja muy claro.

    • Hola, gracias por tus comentarios. En el código especifico que se maneja la respuesta dentro de la función. Lo que vayas a hacer con los datos hazlo dentro de la función en donde está el comentario:
      $.get("archivo.php", function(respuesta){
      //Aquí hacer algo con la variable "respuesta", mostrarla en el HTML, en la consola, etcétera
      });

Entradas recientes

Tramitar acta de nacimiento en línea de manera instantánea

En este post te quiero compartir mi experiencia tramitando un acta de nacimiento de México…

4 horas hace

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

2 semanas hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esta web usa cookies.