Funciones y
programación asíncrona en Node.js
Buenas Prácticas
Salim A. Castellanos R.
salimsalim4@gmail.com
@SCastellanosR
salimsalim4@gmail.com
@SCastellanosR
Una de las ventajas de programar en Node.js es
la posibilidad de ejecutar funciones asíncronas, veremos primero la forma
correcta de ejecutar un callback, y después veremos algún método de hacer esto asíncronamente.
El ejemplo consiste en programar una función
que calcule el factorial de un número y después lo escriba por pantalla,
primero lo haremos con código bloqueante o sincrono y después con código no
bloqueante o asíncrono. En ambos ejemplos mostraremos como se debe utilizar el
callback correctamente. Y al final mostraremos como podemos exportar la función
para que nuestro archivo se convierta en un modulo reutilizable.
Supongo que ya saben crear y ejecutar un
archivo con Node.js, si no es así remítanse al siguiente artículo.
http://xn--nodejs-espaol-skb.blogspot.com/2014/11/instalacion-de-nodejs.html
Empecemos programando la función factorial síncrono:
function factorialSincrono(numero, callback) {
//
Variable donde almacenaremos el resultado.
var
resultado = 1;
//
Variable donde almacenaremos el numero
//
por donde vamos multiplicando.
var
donde = 1;
//
Función que llamaremos recursivamente
//
Para evaluar el progreso y aumentar el contador.
(function actuar() {
if (donde <= numero) {
resultado = resultado * donde;
donde = donde + 1;
actuar(); // Llamado recursivo.
} else {
//ejecución del callback
callback(resultado);
}
})();
}
// Llamada de la función factorialSincrono
// Observar como en el callback se programa lo
que queremos //hacer con el resultado cuando este esté listo.
factorialSincrono(10, function (resultado) {
console.log("El resultado del factorial síncrono es: " +
resultado);
});
console.log("Empezando");
Guardamos el archivo, en mi caso lo guarde como ‘factorialSincrono.js’,
me para en la línea de comandos en la carpeta donde guarde el archivo, lo
ejecuto con ‘node factorialSincrono.js’. Y en la consola me debería de salir en
la primera línea, ‘El resultado del factorial síncrono es: 3628800’, y en la
siguiente línea, ‘Empezando’, esto es porque hasta que no se termino de
ejecutar la operación que calculaba el factorial no continuo con la siguiente línea
que era escribir, ‘Empezando’, en este caso es una operación que se hace
relativamente fácil, pero supongamos que era una consulta a una base que durara
5 segundos, durante todo ese tiempo el servidor estaría bloqueado, y nuestra
siguiente línea se hubiera demorado en ejecutarse.
Por ultimo agreguemos al final la línea:
exports.factorialSincrono
= factorialSincrono;
Y ahora desde otros archivos la podremos importar de la
siguiente forma.
// El archivo
factorialSincrono.js deberá estar ubicado
// en la misma carpeta.
Var factorial = require(“./factorialSincrono”);
factorial(10, function (resultado) {
console.log("El resultado del factorial síncrono es: " +
resultado);
});
Ahora veamos cómo
podemos hacer esta función que se ejecute Asíncronamente para que no bloguee
nuestra ejecución.
Creemos otro
archivo que se llame ‘factorialAsincrono.js’, y reescribamos nuestra función.
function
factorialAsincrono(numero, callback) {
// Variable donde almacenaremos el
resultado.
var resultado = 1;
// Variable donde almacenaremos el numero
// por donde vamos multiplicando.
var donde = 1;
// Función que llamaremos recursivamente
// Para evaluar el progreso y aumentar el
contador.
(function actuar() {
// Es aqui donde se hace la magia
// La funcion nextTick del modulo
global process
// hace que lo que mandemos como
argumento de su callback
// se ejejute en una iteracion futura
del bucle de eventos de Node
process.nextTick(function
() {
if (donde <=
numero) {
resultado = resultado * donde;
donde = donde + 1;
actuar();
} else {
callback(resultado);
}
});
})()
}
// Llamada de la función factorialAsincrono
// Observar como en el callback se programa lo
que queremos //hacer con el resultado cuando este esté listo.
factorialAsincrono(10,
function (resultado) {
console.log("El resultado del
factorial asíncrono es: " + resultado);
});
// Escritura por consola
que nos permitirá mostrar
// que nuestra función es
no bloqueante.
console.log("Empezando1");
Ejecutamos nuestro archivo con, ‘node factorialAsincrono.js’, veremos
que lo primero que se escribe en nuestra consola es, ‘Empezando1’, y después:
‘El resultado del factorial asíncrono es: 3628800’.
Lo que demuestra que nuestro programa no bloqueo nuestra ejecución al pasar por la ejecución de nuestra función asíncrona, escribió ‘Empezando1’ primero, y después cuando estuvo lista nuestra operación de factorización ejecuto su respectivo callback.
‘El resultado del factorial asíncrono es: 3628800’.
Lo que demuestra que nuestro programa no bloqueo nuestra ejecución al pasar por la ejecución de nuestra función asíncrona, escribió ‘Empezando1’ primero, y después cuando estuvo lista nuestra operación de factorización ejecuto su respectivo callback.
Con esto terminamos nuestro artículo de hoy, espero les haya
gustado, dejen sus comentarios, díganme sobre que les gustaría la próxima
entrada, ya casi se acercan los artículos sobre Sails.js, en estos momentos
empezare a terminar de escribir el artículo sobre el modulo global ‘process’,
que empezó escribiéndolo primero que este y este lo termino antes, jajajaja, al
parecer también escribo
asíncronamente.
asíncronamente.
- http://nodejs-español.blogspot.com/2014/11/que-es-nodejs.html
- http://nodejs-español.blogspot.com/2014/11/integracion-de-nodejs-y-netbeans.html
- http://nodejs-español.blogspot.com/2014/11/instalacion-de-nodejs.html
- http://nodejs-español.blogspot.com/2014/11/manejo-de-funciones-y-callback-en-nodejs.html
- http://xn--nodejs-espaol-skb.blogspot.com/2014/11/funciones-y-programacion-asincrona-en.html
- http://xn--nodejs-espaol-skb.blogspot.com/2014/11/modulos-globales-ennode.html
No hay comentarios:
Publicar un comentario