Bienvenidos sean a este post, hoy veremos otro tipo de funciones.
En este post hicimos un breve resumen sobre como son las funciones en Javascript, basicamente son bloques de instrucciones que podremos usar todas las veces necesarias en nuestro codigo, digamos que eso es la definicion estandar de CommonJS pero como node.js tambien soporta el estandar ES6/ES2015 lo cual nos permite utilizar otro tipo de funciones como son las asincronicas.
Las funciones asincronicas se crearon basicamente para cumplir con las «promesas», las promesas son estados de un resultado pero de esto hablaremos un poco mas adelante, gracias a esto este tipo de funcion genera un objeto de tipo AsyncFunction, pasemos a ver como es su sintaxis:
async function(argumentos)
{
... instrucciones ...
}
Basicamente es muy similar a una funcion ordinaria pero le diremos con la palabra async que esta funcion es asincronica, vamos a estudiarlo mediante un simple ejemplo, para ello crearemos un archivo llamado listar.js y le agregaremos el siguiente codigo:
listar.js
const fs = require("fs").promises;
async function listar()
{
try {
var dir=".";
if (process.argv[2]) dir = process.argv[2];
const archivos = await fs.readdir(dir);
for (let a of archivos)
{
console.log(a);
}
} catch (err) {
console.log(err);
}
}
listar();
Primero crearemos una constante donde aplicaremos varios temas que veremos mas adelante, el primero es require que nos servira para cargar un modulo, los modulos son basicamente paquete con funciones que podemos reutilizar en nuestro codigo, despues usamos a promises, otra funcion que veremos mas adelante, pero basicamente es para informar que devolvera un resultado, sea efectivo o una falla, luego tenemos una funcion asincronica, hablemos sobre ella.
En este caso usaremos un try/catch para captar posibles errores, primero definiremos una variable donde almacenara el valor que equivale a nuestro directorio actual, un tema que no mencionamos con require es que le pedimos que cargue al modulo llamado fs, este basicamente se encarga de darnos acceso a funciones para manipular los archivos del sistema, con esto comentado podemos proseguir con el siguiente tema como es un condicional donde verifica si pasamos un argumento al llamar a este codigo, de esto hablamos en este post, en caso de ser verdadero procede a asignarlo a la variable antes definida, nuestro siguiente paso sera la definicion de una constante donde utilizaremos un metodo del modulo fs llamado readdir, el cual se encarga de leer todo el contenido del directorio que pasemos, pero observen que usamos un await antes de la funcion, esto es para suspender la resolucion de la funcion asincrona hasta que no se cumpla la promesa, esto basicamente nos permitira crear un objeto iterable para lo siguiente.
Para el objeto iterable que definimos anteriormente usaremos una variante del bucle for muy interesante dado que por medio de for … of consumiremos todo el objeto iterable y lo almacenaremos en un array, este particularmente es muy bueno para las funcione asincronicas, asi que pueden tenerlo en cuenta para ello, en el bloque del bucle mostraremos cada uno de los elementos que iremos recuperando, por ultimo tenemos el catch del try de nuestro codigo, para este caso mostraremos en consola el error en caso de haber ocurrido alguno, por fuera de nuestra funcion haremos un llamado a la misma para ver el resultado, veamos como funciona mediante el siguiente video
En el video podemos ver como trabaja el script sin argumentos, con argumentos, y con un directorio que no existe, para ver no solamente el contenido sino tambien el error devuelto por el try/catch, con esto vimos definir como una funcion asincronica pero tambien tenemos otra forma de usarla.
Gracias al estandar ES6/ES2015 la palaba async posee otra forma de definir una funcion llamada flecha de funcion, veamos como es su sintaxis:
(async () => {
... instrucciones ...
})()
Es muy similar al anterior pero sin la palabra function y con la flecha, observen que tamibien lo encerramos entre parentesis y por ultimo agregamos el operador de funcion, para entenderlo mejor vamos a tomar el codigo anterior y lo modificaremos de la siguiente manera:
listar.js
const fs = require("fs").promises;
(async () => {
var dir=".";
if (process.argv[2]) dir = process.argv[2];
const archivos = await fs.readdir(dir);
for (let a of archivos)
{
console.log(a);
}
})().catch(err => { console.log(err); });
Al principio seguimos igual que en el codigo anterior pero como dijimos quitamos a function y lo reemplazamos con la flecha pero tambien sacamos el try/catch, aunque no lo hicimos al 100%, el resto del bloque de instrucciones que estaba en el try sigue exactamente de la misma forma y trabaja de la misma manera que explicamos anteriormente, pero al final del operador de funcion agregamos a catch y en este intentaremos capturar el error y en caso de ser asi mostraremos el mensaje en consola en caso de cumplirse, si lo prueban deberan tener el mismo resultado que vimos en el video anterior.
Esto es lo bueno de node.js donde podremos usar el mismo codigo que en Javascript sino tambien tenemos la posibilidad de poder usar otro estandar de programacion, y en esto nos permitira ajustarnos a nuestras necesidades porque como veremos mas adelante para manejar cierto tipos de datos deberemos utilizar este tipo de funcion, la cual a su vez tiene dos formas de manejarse dependiendo de como queramos manejarla.
En resumen, hoy hemos visto funciones asincronicas, que es, como trabaja, con quien trabaja en complicidad, como se puede usar en un ejemplo, tambien hemos visto otra posibilidad que nos permite mediante el otro estandar que maneja el lenguaje, espero les sea de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
