domingo, 30 de noviembre de 2014

Funciones y programacion asincrona en Node.js, ejemplos y buenas practicas, codigo no bloqueante

Funciones y programación asíncrona en Node.js
Buenas Prácticas
Salim A. Castellanos R.
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.

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.


  • 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