Hablando de promesas - parte 3
Esta es la tercera y última parte de una saga de posts acerca de promesas. Para esta parte he decidido enfocarme en un tema que no tocamos muy a menudo pero que es muy interesante y que puede salvar tu vida o al menos varias horas de ella : Promesas recursivas.
Básicamente la recursión es un mecanismo en el cual podemos resolver un problema o tarea definiendo un fragmento de código el cual cuando es ejecutado puede llamarse asi mismo n cantidad de veces. Normalmente hacemos uso de recursividad cuando trabajamos con estructuras que hagan uso de nodos, como arboles, colas, pilas, etc.
En esta imagen podemos ver un ejemplo de un árbol binario, en el cual para acceder a sus nodos debemos hacer uso de los apuntadores o enlaces entre estos para realizar la operación que necesitamos.
Cuando vemos ejemplos de recursión generalmente estos se ejecutan de manera síncrona, pero, ¿qué pasa cuando tenemos que usar recursión en código asíncrono?
No usaremos callbacks, somos gente civilizada
Para mostrar el uso de la recursión y las promesas voy a plantear un escenario en el cual manejaremos una estructura jerárquica de permisos en nuestra base de datos, usando 3 niveles : permisos base, permisos por rol y permisos por usuario. El orden de inspección es desde lo particular a lo general : usuario, rol, base.
En este ejemplo tenemos una tabla de recursos que nos indica que llave tiene permiso, por otro lado tenemos una serie de entidades que poseen una llave que les da acceso a un recurso y el id de su registro padre.
User x, tiene acceso al recurso A directamente, tiene acceso al recurso B a través su padre admin y al C mediante el base ya que es el padre de admin.
Esta no es una implementación real, solo es un ejemplo que elabore para demostrar el punto principal, recursión y promesas.
La primera parte de este ejemplo tiene que ver con definir el conjunto de datos, en este caso yo lo hice con objetos para no hacerlo muy complejo.
La segunda parte de definir una función que me diga si tengo autorización o no, para simular el acceso a un recurso externo hice uso de la función setTimeout y la inserte dentro de una promesa. Como sabemos en la recursión debemos tener 2 cosas :
- La llamada a si mismo.
- Una condición de salida.
El punto 1 se cumple cuando se ejecuta el resolve con una promesa, esta tiene que resolverse y a su vez si a esta le es devuelta una promesa esta también debe resolverse, así podemos seguir hasta llegar a una resolución. El punto 2, se cumple cuando se hace el resolve con un valor que no es una promesa ya que este es devuelto automáticamente.
Al final podemos hacer una serie de promesas, para preguntar sobre los permisos del usuario sobre los recursos.
En este ejemplo utilice setTimeout e hice comparaciones bastante simples, normalmente tenemos comparaciones mas complejos pero esto sirve como demostración. El ejemplo completo lo puedes ver aqui y también la parte 1 y la parte 2 de mis posts de promesas.