Lo primero que me gustaría hacer es pediros disculpas por la tardanza en escribir un nuevo post, aunque no soy de poner excusas, la verdad es que llevo unos meses hasta arriba por diversos motivos personales y profesionales. Además no tiene pinta de que cambie ninguno de los aspectos en un futuro cercano pero intentaré sacar algo de tiempo para seguir escribiendo.
Como supongo que ya sabéis todos (excepto algunos recruiters ;-D) en Fiori utilizamos entre otras cosas las librerías SAPUI5, CSS3, HTML5 y JavaScript. Y en este post vamos a tratar de hablar de unos objetos en JavaScript muy útiles en la programación asíncrona para manejar flujos de eventos dependientes, y la verdad es que me he encontrado que no se conocen lo suficiente, las promesas.
Las promesas son objetos que nos permiten asociar acciones que serán ejecutadas asincrónicamente pero dependiente del resultado de otra acción desencadenante, es decir, nos permite que métodos asíncronos devuelvan valores como si fueran síncronos, ya que nos devuelve en lugar de un determinado valor, una promesa que nos devolverá un resultado en un futuro cercano.
Esto así dicho seguro que no ha quedado muy claro, por lo que voy a tratar de explicarlos con un ejemplo de la vida cotidiana.
Cuando llevamos el coche a arreglar al taller, nos dan un resguardo para pasar a recogerlo y ya nos avisarán. Ese resguardo sería nuestra promesa, es decir, nos indica que un futuro vamos a poder pasar a recoger nuestro coche, pero aún no lo tenemos.
Cuando nos llamen del taller puede pasar que ya hayan arreglado nuestro coche y podemos pasar a recogerlo (nuestra promesa se ha resuelto de forma satisfactoria) o puede que haya habido algún problema y no se haya podido arreglar el coche (por lo que ha habido un error en nuestra promesa). El código sería el siguiente:

Las promesas se crean usando un constructor llamado Promise y pasándole una función que recibe dos parámetros, resolver y rechazar, que nos permiten indicar que la promesa se resolvió o se rechazó.

Una función, denominada ejecutor, realiza la acción (en nuestro ejemplo sería tratar de arreglar el coche) con los correspondientes funciones como parámetros que al ser llamadas resuelven o rechazan la promesa, respectivamente. Si un error es lanzado en la función ejecutor, la promesa es rechazada y el valor de retorno del ejecutor es rechazado.
Una Promesa se encuentra en uno de los siguientes estados:
- Pendiente (pending): estado inicial, aún no se ha resuelto ni rechazado.
- Cumplida (fulfilled): significa que la acción se completó satisfactoriamente.
- Rechazada (rejected): significa que la acción falló.
Una promesa originalmente está Pendiente, mientras se ejecuta la acción asíncrona, cuando llamamos a resolver entonces la promesa pasa a estar Resuelta, si llamamos a rechazar pasa a estar Rechazada, usualmente cuando es rechazada obtenemos un error que nos va a indicar la razón del rechazo. Cuando una promesa se resuelve entonces se ejecuta la función que pasamos al método .then, si la promesa es rechazada entonces se ejecuta la función que pasamos a .catch, de esta forma podemos controlar el flujo de datos.

Con esto vamos a dar por finalizado este post, y dejamos para más adelante el encadenamiento de promesas encadenando then, las promesas en paralelo con el método estático Promise.all o las carreras de promesas con el método Promise.race.
Espero que os pueda ayudar este post, sobre todo para dejar de utilizar esos múltiples anidamientos de callbacks que al final nos lleva a un código complejo y difícil de mantener.
Deja una respuesta