Introducción
Las Promesas de Javascript pueden ser difíciles de entender. Por lo tanto, me gustaría escribir la forma en que entiendo las promesas.
Entendiendo las Promesas
Una Promesa en resumen:
“Imagina que eres un niño. Tu mamá promete que te comprará un nuevo teléfono la próxima semana.”
No sabes si obtendrás ese teléfono hasta la próxima semana. Tu mamá puede realmente comprar un teléfono nuevo para ti, o no lo hace.
Eso es una promesa. Una promesa tiene tres estados. Ellos son:
- Pendiente: No sabes si obtendrás ese teléfono
- Cumplida: Mamá está contenta, te compra un teléfono nuevo
- Rechazada: Mamá está infeliz, no te compra un teléfono
Creando una Promesa
Vamos a convertir esto en JavaScript.
El código es bastante expresivo en sí mismo.
A continuación se muestra cómo se ve normalmente la sintaxis de una promesa:
Consumir Promesas
Ahora que tenemos la promesa, consumámosla:
¡Ejecutemos el ejemplo y veamos el resultado!
Demo: https://jsbin.com/nifocu/1/edit?js,console
Encadenamiento de Promesas
Las promesas son encadenables.
Digamos que tú, el niño, prometes a tu amigo que se lo mostrarás el nuevo teléfono cuando tu mamá te lo compre.
Esa es otra promesa. Escribámosla!
Notas: Podemos acortar el código anterior escribiéndolo como se muestra a continuación:
Vamos a encadenar las promesas. Tú, el niño, solo puedes comenzar la promesa showOff
después de la promesa willIGetNewPhone
.
Así es como puedes encadenar la promesa.
Las promesas son asincrónicas
Las promesas son asincrónicas. Vamos a registrar un mensaje antes y después de llamar a la promesa.
¿Cuál es la secuencia de salida esperada? Podrías esperar:
1. before asking Mom
2. Hey friend, I have a new black Samsung phone.
3. after asking mom
Sin embargo, la secuencia de salida real es:
1. before asking Mom
2. after asking mom
3. Hey friend, I have a new black Samsung phone.
No dejarías de jugar mientras esperas la promesa de tu mamá (el nuevo teléfono). Eso es algo que llamamos asincrónico: el código se ejecutará sin bloquearse ni esperar el resultado. Cualquier cosa que necesite esperar a que se resuelva una promesa para continuar se pone en .then
.
Aquí está el ejemplo completo en ES5:
Promesas en ES5, ES6/2015, ES7/Next
ES5 – Mayoría de navegadores
El código de demostración es funcional en entornos ES5 (todos los principales navegadores + NodeJs) si incluyes la biblioteca de promesas Bluebird. Esto se debe a que ES5 no soporta promesas de forma nativa. Otra famosa biblioteca de promesas es Q de Kris Kowal.
ES6 / ES2015 – Navegadores modernos, NodeJs v6
El código de demostración funciona directamente porque ES6 soporta promesas de manera nativa. Además, con las funciones de ES6, podemos simplificar aún más el código con una función flecha y usar const
y let
.
Aquí está el ejemplo completo en código ES6:
Ten en cuenta que todos los var
han sido reemplazados con const
. Todas las function(resolve, reject)
se han simplificado a (resolve, reject) =>
. Estos cambios traen varios beneficios.
ES7 – Async/Await
ES7 introdujo la sintaxis async
y await
. Hace que la sintaxis asíncrona sea más fácil de entender, sin los .then
y .catch
.
Reescribamos nuestro ejemplo con la sintaxis ES7:
Promesas y Cuándo Utilizarlas
¿Por qué necesitamos promesas? ¿Cómo era el mundo antes de las promesas? Antes de responder estas preguntas, regresemos a los fundamentos.
Función Normal VS Función Asíncrona
Veamos estos dos ejemplos. Ambos ejemplos realizan la suma de dos números: uno los suma utilizando funciones normales, y el otro los suma de manera remota.
Función Normal para Sumar Dos Números
Función Asíncrona para Sumar Dos Números
Si sumas los números con la función normal, obtienes el resultado inmediatamente. Sin embargo, cuando haces una llamada remota para obtener el resultado, necesitas esperar, y no puedes obtener el resultado de inmediato.
No sabes si obtendrás el resultado porque el servidor podría estar inactivo, responder lentamente, etc. No quieres que todo tu proceso se bloquee mientras esperas el resultado.
Llamar a APIs, descargar archivos y leer archivos son algunas de las operaciones asíncronas habituales que realizarás.
No necesitas usar promesas para una llamada asíncrona. Antes de las promesas, usábamos callbacks. Los callbacks son una función que llamas cuando obtienes el resultado de retorno. Modifiquemos el ejemplo anterior para aceptar un callback.
Acción Asíncrona Subsiguiente
En lugar de sumar los números uno por uno, queremos sumar tres veces. En una función normal, haríamos esto:
Así es como se ve esto con callbacks:
Demo: https://jsbin.com/barimo/edit?html,js,console
Esta sintaxis es menos amigable para el usuario debido a los callbacks anidados profundamente.
Evitar Callbacks Anidados Profundamente
Las promesas pueden ayudarte a evitar callbacks anidados profundamente. Veamos la versión con promesas del mismo ejemplo:
Con las promesas, aplanamos la devolución de llamada con .then
. De alguna manera, parece más limpio porque no hay anidamiento de devoluciones de llamada. Con la sintaxis async
de ES7, podrías mejorar aún más este ejemplo.
Observables
Antes de decidirte por las promesas, existe algo que ha surgido para ayudarte a manejar datos asíncronos llamado Observables
.
Veamos el mismo ejemplo escrito con Observables. En este ejemplo, usaremos RxJS para los observables.
Los Observables pueden hacer cosas más interesantes. Por ejemplo, delay
añadir función por 3 segundos
con solo una línea de código o reintentar para que puedas reintentar una llamada un cierto número de veces.
Puedes leer uno de mis posts sobre RxJs aquí.
Conclusión
Es importante familiarizarse con las callbacks y las promesas. Entiéndelas y utilízalas. No te preocupes por los Observables por ahora. Las tres pueden influir en tu desarrollo dependiendo de la situación.
Source:
https://www.digitalocean.com/community/tutorials/understanding-javascript-promises