a / subir /Curso de Fundamentos de JavaScript /06-Asincronía en JavaScript /02-Promesas en JavaScript Asincronía y Manejo de Estados.vtt
2999a's picture
Upload via hfc (batch)
f959acc verified
WEBVTT
00:00.000 --> 00:03.800
Entendamos entonces qué son las promesas.
00:03.800 --> 00:06.920
Aquí tenemos un HTML muy
sencillo,
00:06.920 --> 00:08.840
ya lo tenemos abierto en el navegador.
00:08.840 --> 00:11.080
Vamos a pasar al
JavaScript.
00:11.080 --> 00:14.640
Entonces, las promesas es lo que nos va a
ayudar a hacer
00:14.640 --> 00:17.800
que nuestro código pase de ser
síncrono
00:17.800 --> 00:20.360
a que pueda ser un código asíncrono.
00:20.360 --> 00:22.960
Es la forma en la cual nosotros vamos a
decir al navegador,
00:22.960 --> 00:25.280
oye, esta función en
particular,
00:25.280 --> 00:27.320
tienes que trabajarla de forma
separada
00:27.320 --> 00:30.080
y ya que esté resuelta, me la puede
regresar
00:30.080 --> 00:32.280
para que yo la pueda agregar al call
stack
00:32.280 --> 00:34.040
y me pueda dar un
resultado.
00:34.040 --> 00:36.600
Y podemos tener ciertos ejemplos
ahorita
00:36.600 --> 00:39.880
para poder entender cómo se van disparando
ciertas funciones.
00:39.880 --> 00:42.120
Tendríamos dos funciones que se van a
disparar
00:42.120 --> 00:45.480
de forma síncrona y en medio de estas dos
funciones
00:45.480 --> 00:49.080
podemos generar una promesa que al momento
de que se dispare,
00:49.080 --> 00:50.840
nosotros esperaríamos tener, por ejemplo,
00:50.840 --> 00:53.400
el resultado de cada una de las funciones,
00:53.400 --> 00:55.320
pero la promesa va a venir
después
00:55.320 --> 00:58.920
porque va a ser lo último que se va a
solucionar.
00:58.920 --> 01:00.960
Entonces, ¿qué son las
promesas?
01:00.960 --> 01:03.680
Como te comentaba, las promesas es la
forma
01:03.680 --> 01:06.840
en la cual nosotros vamos a generar que
nuestro código
01:06.840 --> 01:09.840
pueda funcionar de forma
asíncrona.
01:09.840 --> 01:12.880
Y las promesas tienen tres
estados.
01:12.880 --> 01:17.320
El primer estado es pending, que es el
estado de pendiente.
01:18.560 --> 01:22.120
Este estado es cuando la promesa se va a
crear.
01:22.120 --> 01:24.160
Cuando nosotros creamos una promesa,
01:24.160 --> 01:27.920
que las promesas las vamos a trabajar de
inicio,
01:27.920 --> 01:31.840
de esta forma, se va a generar un primer
estado
01:31.840 --> 01:36.040
que es el estado de
pending.
01:38.760 --> 01:42.280
Ese estado de pending está en
pendiente
01:42.280 --> 01:44.920
porque se va a empezar a generar la promesa.
01:44.920 --> 01:47.840
El segundo estado es
fulfill.
01:47.840 --> 01:52.840
Y este estado va a venir cuando la promesa
se resuelva.
01:54.320 --> 01:57.360
Una vez que la promesa se resuelva para
bien o para mal,
01:57.360 --> 01:59.280
se va a poner en
fulfill.
01:59.280 --> 02:03.280
Y el tercer estado es
reject,
02:04.720 --> 02:07.000
que es cuando la promesa no se resolvió.
02:07.840 --> 02:10.320
Por algún punto, la promesa no se
resolvió
02:10.320 --> 02:12.680
y ese es el estado que nos va a regresar.
02:12.680 --> 02:16.440
Ahora, las promesas manejan dos tipos de
callback.
02:16.440 --> 02:18.640
La primera es
resolve,
02:20.360 --> 02:25.000
que evidentemente es cuando la promesa se
resuelve
02:25.000 --> 02:27.160
de forma
satisfactoria.
02:27.160 --> 02:29.840
Y la segunda es
reject,
02:29.840 --> 02:33.800
que es cuando la promesa no se puede resolver.
02:33.800 --> 02:35.240
Es importante poder
entender
02:35.240 --> 02:37.720
lo que son los estados de la promesa,
02:39.920 --> 02:40.840
que son
estos.
02:41.800 --> 02:45.080
Y de igual forma, es importante poder
entender
02:45.080 --> 02:50.080
cuáles son los callbacks que tienen las
promesas.
02:52.000 --> 02:55.440
También vamos a poder tener dos métodos en
las promesas
02:55.440 --> 02:56.480
que son
importantes.
02:56.480 --> 02:59.840
Nosotros generamos una primer función como
una promesa,
02:59.840 --> 03:04.520
pero podemos utilizar el then, que es un
método.
03:04.520 --> 03:08.000
Este método se ejecuta cuando la promesa
se resuelve.
03:08.000 --> 03:12.320
Una vez que la promesa está lista, ya está
fulfill,
03:12.320 --> 03:15.120
y está como con un callback de se resuelve,
03:15.120 --> 03:18.360
entonces va a entrar a ejecutarse el then.
03:18.360 --> 03:21.840
Y tenemos otro método que se llama catch.
03:21.840 --> 03:26.360
Este es importante porque el catch es lo
que va a suceder
03:26.360 --> 03:28.480
cuando la promesa no se
resuelve,
03:28.480 --> 03:33.000
y en el catch vamos a poder nosotros
obtener el error
03:33.000 --> 03:35.560
para poder imprimirlo y que nos pueda
decir
03:35.560 --> 03:36.920
qué es lo que está
pasando
03:36.920 --> 03:39.520
que hace que la promesa no se resuelva.
03:39.520 --> 03:41.480
Comencemos con el
ejemplo.
03:41.480 --> 03:46.160
Empezamos con una constante, se va a
llamar promesa,
03:46.160 --> 03:51.160
y aquí vamos a construir una instancia de
promesa.
03:54.880 --> 03:59.760
Esta instancia va a tener dos
parámetros
03:59.760 --> 04:03.520
que va a ser resolve y
reject.
04:04.960 --> 04:06.840
Ya que lo tenemos
ahí,
04:06.840 --> 04:11.840
terminamos con la sintaxis de nuestra promesa,
04:12.960 --> 04:16.640
y aquí vamos a mandar llamar un
setTimeout
04:16.640 --> 04:19.160
para generar como una
validación.
04:19.160 --> 04:21.120
Vamos a, por
ejemplo,
04:21.120 --> 04:25.240
tener como si estuviéramos haciendo a lo
mejor
04:26.880 --> 04:28.280
el llamado de un
API,
04:28.280 --> 04:29.760
y estamos esperando que se
resuelva
04:29.760 --> 04:31.280
y que nos regrese
algo.
04:31.280 --> 04:34.200
Entonces, para que esto pueda funcionar,
04:34.200 --> 04:37.880
el setTimeout nos va a ayudar para darle
un tiempo
04:37.880 --> 04:40.840
a que este llamado del API se pueda resolver,
04:40.840 --> 04:43.760
y una vez que esté resuelto, nos regrese
el resultado.
04:43.760 --> 04:45.040
Aquí lo vamos a
fakear,
04:46.320 --> 04:47.600
lo vamos a llamar un
API,
04:47.600 --> 04:50.040
vamos a generar una
variable
04:50.040 --> 04:54.560
que nos fakee el resultado de la respuesta,
¿no?
04:54.560 --> 04:56.640
Entonces tenemos nuestro setTimeout.
04:58.320 --> 04:59.400
Ya estando
acá,
04:59.400 --> 05:01.720
aquí es donde pondríamos nosotros como el
código
05:01.720 --> 05:04.240
si estuviéramos haciendo la petición de un
API,
05:04.240 --> 05:06.280
vamos a utilizar un fetch o algo similar,
05:06.280 --> 05:09.720
yo voy a generar una variable que se llama
operation
05:12.040 --> 05:12.880
successFull,
05:15.200 --> 05:17.240
y va a ser igual a
true,
05:17.240 --> 05:19.320
dando como
referencia
05:19.320 --> 05:24.320
de que lo que pasó aquí en el código del
setTimeout
05:24.480 --> 05:26.080
regresó a éxito,
¿no?
05:26.080 --> 05:28.040
Entonces podemos
continuar.
05:28.040 --> 05:29.040
Y en la parte de
abajo,
05:29.040 --> 05:31.440
voy a hacer una pequeña
validación.
05:31.440 --> 05:33.240
Si
operation
05:34.520 --> 05:35.360
successFull,
05:38.200 --> 05:39.080
si
operación,
05:39.080 --> 05:42.720
si esta operación fue
exitosa,
05:42.720 --> 05:43.680
entonces
05:44.800 --> 05:47.120
regrésame el
result.
05:48.280 --> 05:50.080
¿Quiere aquí en el
result?
05:50.080 --> 05:51.480
Podemos poner
como
05:53.680 --> 05:54.600
la
operación
05:54.600 --> 05:59.600
fue
exitosa.
06:02.000 --> 06:04.280
Y en caso de que no sea
exitosa,
06:05.880 --> 06:07.920
me va a regresar el
reject.
06:16.560 --> 06:17.560
Ahí va la
operación.
06:17.560 --> 06:22.560
Aquí ponemos
acentos.
06:25.960 --> 06:29.000
Y este if, esta
validación,
06:29.000 --> 06:33.240
tiene que ir adentro de nuestro setTimeout.
06:33.240 --> 06:34.800
Y ya que estamos con
esto,
06:34.800 --> 06:37.360
entonces le decimos que queremos que se
resuelva
06:37.360 --> 06:39.160
en dos
segundos.
06:40.680 --> 06:43.640
Entonces es el tiempo que le vamos a dar
al setTimeout
06:43.640 --> 06:45.600
para que pueda resolver esta operación.
06:45.600 --> 06:48.640
Aquí, como nosotros le estamos
poniendo
06:48.640 --> 06:50.800
que la operación sí fue
exitosa,
06:50.800 --> 06:53.480
esto va a pasar y nos tendrá que
resolver
06:53.480 --> 06:56.280
con, oye, la operación fue
exitosa.
06:56.280 --> 06:58.280
En caso de que esto no
pasara,
06:58.280 --> 07:00.440
digamos, alguna petición o un
API,
07:00.440 --> 07:03.000
de repente nos regresara como un false,
07:03.000 --> 07:06.160
entonces aquí entraría el
else
07:06.160 --> 07:07.560
y nos regresaría el
reject.
07:08.560 --> 07:10.440
Entonces ahorita vamos a
guardar.
07:12.280 --> 07:13.680
Si venimos aquí a
navegador,
07:13.680 --> 07:16.480
y mandamos llamar nuestra
función,
07:16.480 --> 07:17.320
le damos
enter,
07:18.600 --> 07:21.160
vemos aquí que nos está regresando algo.
07:21.160 --> 07:23.320
Nos está regresando una
promesa,
07:23.320 --> 07:26.120
nos está diciendo que la promesa ya fue
resuelta,
07:26.120 --> 07:28.000
fulfill, ya está
lista,
07:28.000 --> 07:30.640
y nos está regresando entonces el resultado.
07:30.640 --> 07:33.520
Quiere decir que la operación fue exitosa.
07:33.520 --> 07:34.360
¿Por
qué?
07:34.360 --> 07:38.240
Porque aquí le estamos diciendo que lo
esperado es verdad.
07:38.240 --> 07:39.640
Ahora, si cambiamos
esto,
07:39.640 --> 07:40.840
y
guardamos,
07:40.840 --> 07:42.240
vamos a ver que nos
regresa.
07:46.120 --> 07:47.440
Nos regresa lo
mismo,
07:47.440 --> 07:50.880
por aquí nos dice que nos está regresando
el reject,
07:50.880 --> 07:54.400
y nos está regresando el mensaje de esto
falló,
07:54.400 --> 07:57.240
y entonces es la operación
falló.
07:57.240 --> 07:58.960
Este es un ejemplo
básico.
07:58.960 --> 08:01.440
Ahora, ¿cómo nosotros podríamos
obtener?
08:01.440 --> 08:04.040
Aquí nosotros tenemos que venir a la
terminal
08:04.040 --> 08:06.480
a poder poner la
operación,
08:06.480 --> 08:11.400
venir a la terminal a poder poner la
función
08:11.400 --> 08:13.640
para poder ver en la terminal que es lo
que está pasando,
08:13.640 --> 08:16.600
pero ¿cómo nos puede regresar
automáticamente
08:16.600 --> 08:19.200
esta función, el
resultado?
08:19.200 --> 08:20.800
Nos regresamos a nuestro
código,
08:21.640 --> 08:23.440
utilizamos nuestra
función,
08:24.600 --> 08:26.760
y aquí es donde vamos a estar
utilizando
08:26.760 --> 08:30.400
los métodos que tienen las promesas.
08:31.440 --> 08:33.200
Podemos venir
aquí,
08:33.200 --> 08:36.840
y utilizamos punto y el método
uno.
08:36.840 --> 08:38.680
Entonces el método
den,
08:38.680 --> 08:42.560
lo que hace es se ejecuta cuando la
promesa se resuelve.
08:42.560 --> 08:45.640
Entonces lo que va a hacer es que va a
ejecutar,
08:45.640 --> 08:47.880
una vez que la promesa se
resuelve,
08:47.880 --> 08:50.800
lo que nosotros queremos traer es lo que
sea
08:50.800 --> 08:53.720
que va a estar viniendo aquí en este código.
08:53.720 --> 08:56.000
Entonces aquí le estamos diciendo como den,
08:57.240 --> 09:01.080
y lo que queremos que nos traiga es un
mensaje
09:01.080 --> 09:04.360
que el mensaje tiene que ser como el
mensaje de éxito
09:04.360 --> 09:06.560
en este momento, entonces podemos ponerle,
09:07.560 --> 09:10.520
success
message,
09:14.160 --> 09:17.160
y el código aquí va a ser nada más un console.
log.
09:21.160 --> 09:22.880
Y en el
console.log,
09:22.880 --> 09:27.880
queremos que nos imprima el mensaje de éxito,
09:27.920 --> 09:29.880
que tendría que ser este
mensaje.
09:29.880 --> 09:32.840
Ahora, si esto no se resuelve a favor,
09:32.840 --> 09:34.840
estamos esperando entonces un catch.
09:36.080 --> 09:37.840
¿Qué es lo que
pasó?
09:37.840 --> 09:40.800
Nos interesa de perfecto, si esto no fue
un éxito,
09:40.800 --> 09:43.240
si no me está regresando el código que yo
esperaba,
09:43.240 --> 09:45.520
entonces regresame el
error.
09:51.360 --> 09:53.640
Y con el error hacemos lo
mismo.
09:53.640 --> 09:55.120
¿Cuál es el
código?
09:55.120 --> 09:57.840
O qué es lo que estamos esperando que se
ejecute,
09:57.840 --> 09:59.920
si existe un
error.
10:01.600 --> 10:03.400
Y en este caso, solo para el ejemplo,
10:03.400 --> 10:05.640
lo que yo estoy esperando que se
ejecute
10:05.640 --> 10:07.920
es prácticamente el mensaje de
error
10:07.920 --> 10:10.160
que yo tenía
planificado.
10:10.160 --> 10:11.120
Entonces
guardamos.
10:13.160 --> 10:16.560
Se tomó un tiempo y aquí nos dice que
tenemos un error
10:16.560 --> 10:18.840
en la línea 17 y está
acá.
10:21.440 --> 10:23.240
Entonces si ahora volvemos a guardar,
10:24.440 --> 10:27.320
bien, aquí está otro
typo.
10:27.320 --> 10:28.400
Perfecto.
10:28.400 --> 10:30.480
Entonces al momento de que yo estoy guardando,
10:30.480 --> 10:31.720
se está
demorando,
10:31.720 --> 10:33.320
pero está demorando los dos
segundos
10:33.320 --> 10:34.640
que le estoy poniendo
aquí.
10:34.640 --> 10:36.200
Entonces si yo vuelvo a
cargar,
10:37.560 --> 10:40.320
dos segundos y ahora,
perfecto,
10:40.320 --> 10:42.280
ya nos dice la operación
falló.
10:42.280 --> 10:43.680
¿Por qué está
fallando?
10:43.680 --> 10:45.560
Porque aquí en la
promesa,
10:45.560 --> 10:48.760
yo le estoy poniendo que sea diferente a true.
10:48.760 --> 10:52.440
Si quitamos ese, que sea diferente a
true
10:52.440 --> 10:53.640
y le damos
guardar,
10:54.560 --> 10:56.440
se tarda dos
segundos
10:56.440 --> 10:57.480
y entonces ya nos
regresa,
10:57.480 --> 10:59.720
oye, la operación fue
exitosa.
10:59.720 --> 11:02.000
Entonces el then y el
catch
11:02.000 --> 11:03.640
es lo que nosotros vamos a
utilizar
11:03.640 --> 11:05.920
para poder ejecutar el
resultado
11:05.920 --> 11:07.360
que venga de nuestra
promesa,
11:07.360 --> 11:09.960
que en este caso, nuestra promesa tiene un
setTimeout,
11:09.960 --> 11:12.440
que también es prácticamente una promesa.
11:13.400 --> 11:15.560
Y una vez que eso se termina de ejecutar,
11:15.560 --> 11:18.640
mandamos llamar nuestra promesa con el
then
11:18.640 --> 11:20.160
para que se ejecute el
código
11:20.160 --> 11:22.280
que esperamos una vez que la
promesa
11:22.280 --> 11:26.080
pues se haya resuelto de forma exitosa.
11:26.080 --> 11:28.280
Y en caso de que eso no
funcione,
11:28.280 --> 11:30.440
entonces que nos regrese el
catch
11:30.440 --> 11:32.760
para que nosotros podamos saber
principalmente
11:32.760 --> 11:33.720
cuál fue el
error
11:33.720 --> 11:58.720
y por qué no se resolvió la promesa como
lo esperábamos.