Anuncios

Bienvenidos sean a este post, hoy veremos como rutear funciones asincronicas.

Anuncios

Si vienen de los posts anteriores hemos mencionado tres problemas: la primera es la piramide de la perdicion y la segunda es donde se entregan los resultados y errores de las funciones asincronicas, para entender este concepto vamos a mirar el siguiente ejemplo:

db.query('SELECT ..etc..', function(err, resultado) { 
   if (err) { 
      // Aqui procesaremos los errores
   } else { 
      // y aqui los resultados obtenidos.
    } 
}); 
// Pero queremos que los resultado o errores lleguen aqui
Anuncios
Anuncios

Este es un ejemplo de Ryan Dahl para las primeras versiones de node.js, nuestra meta es evitar el bloqueo del evento loop en una operacion larga, una opcion interesante es diferir los resultados o errores mediante funciones callback y puede ser una solucion siendo tambien uno de los fundacionales de node.js pero esta implementacion puede derivar en el problema de piramide de la perdicion, aqui aparecen las promesas que nos permiten evitar este tipo de problema porque ya no necesitamos hacer este tipo de forma, como vimos en el post anterior, esto tambien captura errores y nos asegura una entrega de ubicacion segura pero en ambos casos, errores y resultados, estan incrustados en funciones anonimas y no son entregadas a la proxima linea de codigo.

Anuncios

En otros posts hemos visto como a traves de funciones asincronicas podemos crear codigo asincronico muy limpio, si tomamos el ejemplo anterior y convertimos a db.query a una funcion asincronica seria algo similar a esto:

async function dbQuery(params) {
  const resultado = await db.query('SELECT ..etc..');
  // Los errores y resultados vienen aqui
  return resultado;
}
Anuncios

Este es mucho mas limpio comparado con el anterior y los resultados y errores se ubican en un lugar mas proximo a lo que queremos, pero volvamos a hablar sobre Express y para ello tomaremos el codigo de piramide de perdicion en este post y vamos a reescribirlo como una funcion asincronica:

router.get('/path/a/algo', async (req, res, next) => { 
  try {
    const dato1 = await funcion(req.query.arg1, req.query.arg2);
    const dato2 = await funcion1(req.query.arg3,
                           req.query.arg2, data1);
    const dato3 = await funcion2(req.query.arg1,
                           req.query.arg42);
    const dato4 = await funcion3();
    res.render('page', { dato1, dato2, dato3, dato4 }); 
  } catch(err) {
    next(err);
  }
});
Anuncios
Anuncios

En este ejemplo aplicamos las funciones try/catch para poder capturar errores, si lo comparamos con las versiones anteriores observaremos que es un codigo mas limpio, tanto como la piramide o la cadena, asi como se borro codigo repetitivo y a su vez no se pierde nada dentro de una funcion callback y al mismo tiempo todo llega a la proxima linea de codigo donde es conveniente, observen que tenemos a la palabra await en cada variable lo cual hace que cada una de las funciones devuelva una promesa y esta se encargara de su resolucion, por lo tanto cada una de estas funciones puede ser asincronica y esta devolvera automaticamente una promesa o bien crear una promesa para que maneje una llamada a una funcion asincronica.

Anuncios
Anuncios

Pero una funcion generadora es tambien invocada, aunque no necesitamos saber como trabaja, pero si entender que el await sera el artista principal encargado de la ejecucion y resolucion de la promesa ya sea de forma correcta o no, pero como hablamos en post anteriores Express no puede manejar los errores asincronicos o resultados directamente y para notificarlos debe hacerlo mediante el next, por esta razon debemos usar a try/catch para tener una buena integracion con Express y si observan el resultado exitoso es enviado por medio de res.render y mediante catch pasaremos el resultado erroneo y lo enviaremos mediante next(err), con este post hemos completado la teoria de como se vinculan las funciones asincronicas y Express, sus distintas formas y como una puede ser mas optima que la otra y nos da paso a la siguiente aplicacion.

Anuncios

En resumen, de vuelta hemos visto de forma muy teorica como utilizar funciones asincronicas con funciones de ruteo, mas precisamente como podemos aplicar funciones asincronicas con Express, y una opcion mas para poder implementarlo de mejor forma, espero les haya resultado 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