Anuncios

Bienvenido sean a este post, primera introduccion sobre este tema.

Anuncios

Cuando hablamos sobre Middleware en Express en este post mencionamos que cuando crearon Express todavia no existian las promesas y funciones asincronicas por lo tanto no estan directamente integradas en este pero aun asi podemos utilizarlas, para poder implementarlas correctamente debemos seguir las siguientes reglas:

  • Errores de sincronismos deben ser capturados por Express y enviados al manejador de la aplicacion
  • Estos errores deben ser reportados mediante el llamado a next(err)
  • Una ejecucion exitosa de Middleware le indique a Express que llame a la proxima mediante next()
  • Una funcion de ruteo que devuelve el resultado a una solicitud HTTP no llama a next()
Anuncios

Tanto las promesas como las funciones asincronicas son utilizadas para computar de forma diferida y hacer que las funciones callback anidadas sean una cosa del pasado:

  • Una clase Promise representa una operacion que no se ha completado pero se espero que lo haga, cuando las usamos aplicabamos a then o catch para procesarla correctamente o si produjo un error respectivamente.
  • En las funciones asincronicas tenemos la palabra await disponible para que esperemos la resolucion de una promesa y este se encargara de devolver el resultado exitoso o no
Anuncios
Anuncios

Una particularidad que posee es que podemos escribir codigo asincronico que se parece a codigo sincronico pero que en lugar de enviar resultados y errores a funciones callbacks se los envia como si fueran excepciones y el resultado a la siguiente linea de codigo, como esta es una caracteristica de Javascript tenemos varias practicas de programacion asincronica tradicional que se deben integrar correctamente y para poder administrar correctamente codigo asincronico debe incluir lo siguiente:

  • La libreria async es una coleccion de funciones para varios patrones asincronicos, originalmente se implemento alrededor del paradigma de las funciones callback pero en la actualidad puede manejar funciones asincronicas y esta disponible como un paquete de ES6
  • Antes de que Promises se estandarizara se utilizaban dos implementaciones, Bluebird y Q, pero hoy en dia se utiliza principalmente al objeto Promise pero estos pueden seguir siendo usados dado que ofrecen caracteristicas adicionales
Anuncios
Nota:
Si quieren saber mas sobre ellos les dejo sus paginas web:
BlueBird [http://bluebirdjs.com/]
Q [https://www.npmjs.com/package/q]
Anuncios

Estas herramientas nos permiten crear codigo asincronico de manera sencilla y evitar el problema denominado como Piramide de la Perdicion (Pyramid of Doom), se lo denomina asi debido a la forma que toma cuando hacemos demasiado anidado con muchos callbacks en distintos niveles de profundidad, tomemos el siguiente ejemplo:

router.get('/path/a/algo', (req, res, next) => { 
  funcion(req.query.arg1, req.query.arg2, (err, dato1) => { 
    if (err) return next(err); 
    funcion1(req.query.arg3, req.query.arg2, dato1, (err2,
     dato2) => { 
      if (err2) return next(err2); 
      funcion2(req.query.arg1, req.query.arg42,
                     (err3, dato3) => { 
        if (err3) return next(err3); 
        funcion3((err4, dato4) => { 
          if (err4) return next(err4); 
          res.render('page', { dato1, dato2, dato3, dato4 }); 
        }); 
      }); 
    }); 
  }); 
});
Anuncios
Anuncios

En este caso solo tenemos un ejemplo de como un llamado de una funcion a otro va creando un anidamento mas profundo de llamados de funciones y si bien no debemos preocuparnos por estas si debemos tener en cuenta que estas pueden llevar a otra y cuando menos lo pensemos estaremos en la mitad de la piramide, pero mediante funciones asincronicas podemos evitar esto dado que tendremos un codigo mas claro y para ello debemos analizar como las promesas son usadas para manejar los resultados asincronicos y un conocimiento mas profundo de las funciones asincronicas.

Anuncios

Como mencionamos hasta ahora, una promesa puede devolver un estado de resuelto o no, esto implica que para crear una promesa debemos usar a:

new Promise
Anuncios

E inicialmente estara en un estado no resuelto, y el objeto Promise transicionara al estado resuelto a traves de la llamada de dos funciones, siendo resolve para cuando esta resuelto y reject para cuando no, veamos los tres posibles estados de una promesa:

  • Pending, estado inicial mientras no se resuelva
  • Fullfilled, estado cuando se resolvio exitosamente
  • Rejected, estado cuando fallo
Anuncios

Veamos la siguiente funcion asincronica como ejemplo:

function leer(archivo) {
  return new Promise((resolve, reject) => {
    fs.readFile(archivo, (err, data) => {
      if (err) reject(err);
      else resolve(data);
    });
  });
}
Anuncios

En este caso la usaremos para leer un archivo, le decimos que devolvera una promesa, y tiene dos posibles valores, despues mediante el metodo readFile le diremos que lea el archivo en cuestion, y aqui tambien tendremos dos valores, si existe el valor en err se considera como un error y por lo tanto lo devolveremos con reject en cambio pasaremos a traves de resolve el valor en data, consideremos el siguiente bloque de codigo:

leer(archivo) 
.then((resultado) => { 
   // Se procesa el resultado exitoso
   // aqui haremos algo con este
   return nuevoResultado;
}) 
.catch(err => { 
   // Se procesa el error devuelto
}); 
Anuncios
Anuncios

En este caso a la funcion anterior al devolver una promesa no podemos usarlo directamente y para ello usaremos dos metodos para poder procesar correctamente la promesa que se devuelve, el primer caso es then donde sera para cuando devolvemos un valor exitoso y despues a catch para el caso cuando devuelve un error, a su vez el then devuelve otra promesa por lo tanto podemos encadenarlo con otros para procesarlos de otras formas, esto se denomina como cadena de promesas pero de eso hablaremos en otro post.

Anuncios

En resumen, hoy hemos visto un poco mas sobre las promesas y funciones asincronicas, porque no estan integradas de base con Express, pero comentamos como podemos integrarlas, asi como las reglas basicas que debemos tener en cuenta para manejarlas correctamente, asi como tambien como usarlas en las funciones asincronicas y como manejar la informacion devuelta, espero les haya sido 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.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50