This graph shows how many times the word ______ has been mentioned throughout the history of the program.
Vi en Twitter un hilo donde comentaban que Async Await complica el código, sobre todo cuando hay dependencia entre promises.
Usaban promise.org, promise settle, ¿tú lo usaste? ¿Qué opinas? A ver, Codelex, Codelex89.
Yo no creo que Async Await complique el código, todo tiene su caso de uso.
De hecho, a mí muchas veces mucha gente me dice, ¿por qué no has utilizado Async Await?
A ver, el tema que tiene Async Await, Fetch Resources, el tema que tiene Async Await es que hay que saber utilizarlo y saber qué ocurre con el código cuando utilizas Async Await.
Por ejemplo, si nosotros tenemos esto, Fetch Resources, Fetch, vamos a poner aquí Fetch Categories y aquí Fetch Post, ¿vale?
Y esto pongamos que hace un Fetch no sé qué, no sé cuánto, y esto hace un Fetch no sé qué, no sé cuánto.
Mira, un error muy típico que además hace la gente es que cuando tiene una función asíncrona, se cree que ya si haces aquí este Fetch aquí, pues tienes que hacer un Await de esto.
Y no tiene por qué, o sea, tú puedes mezclar promesas con Async Awaits.
Por ejemplo, tú puedes hacer aquí un Retour del Fetch y este Fetch además utilizar las promesas.
Podrías hacer aquí .den y utilizar aquí una promesa, JSON, no sé qué, no sé cuánto.
Luego, el problema que comentas tú del Promis All es que imaginemos que estos son dos funciones asíncronas, que la voy a poner así porque no es importante.
Imaginemos que lo que hace dentro es totalmente asíncrono.
Y tenemos aquí nuestra aplicación.
Nuestra aplicación, ¿vale?
Vamos a poner que aquí tendría, pues, Limit y aquí Types, por decir algo.
Esto además es un caso que vi el otro día de una persona que lo estaba haciendo y le intenté explicar y le chocó mucho lo que le dije.
Como que estaba, no puede ser.
Y yo, hostia, pues te lo prometo.
O sea, y es bastante importante y es una pregunta de entrevista súper típica, además.
El hecho es que si tú tienes estas dos funciones asíncronas, imagínate que yo hago aquí, pues, tengo las categorías, hago una Wait del Fetch Categories, ¿vale?
Le pongo Types y aquí le pongo Movies, por decir algo.
Y luego tengo aquí los Posts y hago una Wait de Fetch Post y le pongo Limit que sea 5, ¿vale?
Entonces, estoy seguro que muchos de ustedes estarán, bah, que esto está mal, ¿no?
Y bueno, sí, tiene su cosa, ¿no?
Porque el problema que tenemos aquí es que, a ver, no está mal este código, pero es ineficiente.
Porque lo que estamos haciendo aquí es que lo que hace la línea 10 es que, vale, recupera las categorías,
pero primero hace el Fetch Categories y espera el resultado del Fetch Categories, que es una llamada síncrona.
Imaginemos que esto tarda 10 segundos y luego la siguiente línea recupera los Posts, ¿vale?
Que esto, imaginemos que tarda 5 segundos.
Por lo tanto, lo que estamos haciendo aquí es que lo que tarda de ir de la línea 10 a la línea 13 son 15 segundos, ¿vale?
Porque estamos sumando primero 10 segundos y luego 5 segundos.
Es lo que tiene la Wait.
Al hacer que esto sea como código síncrono, lo que está ocurriendo aquí es que espera en esta línea.
Y además esto funciona con funciones generadoras, que es el otro mundo.
Tenemos un array de promesas.
En la primera hacemos un Promise Resolve de 13.
Promise.
En la segunda hacemos un Promise Reject.
No estoy utilizando Visual Studio Code.
Esto es Run.js.
Se llama Run.js.
Promise Reject.
Y entonces hay que devolverle un error que decimos esto es un error.
Luego, en la tercera vamos a hacer una promesa que se dispare después de un rato.
Por ejemplo, hacemos un New Promise y esto devuelve una promesa que tiene un Set Timeout.
Y esto resuelve con 13 después de...
Bueno, 13 vamos a poner 26.
Después de 100 milisegundos, por ejemplo.
¿Vale?
Vale.
Entonces, lo que me aparece por aquí es porque la promesa ha sido Rejected y tal.
Por ahora voy a hacer entonces un Catch.
Vamos a mirar el error.
Console.Log.Error.
Y por si os interesa vamos a hacer también un Then, ¿vale?
Con los Values.
A ver si tenemos Values.
Values.
¿Vale?
Then y el Catch.
Vale.
Podemos ver que aquí...
Aquí no entra.
¿Vale?
Aquí no entra.
Esto es con el Promise All.
¿Hasta aquí bien?
Y se ve bien, ¿no?
Se ve bien ahora la pantalla.
Vale.
Esto es con el Promise All.
Entonces, el Promise All Settle...
Settle.
Settle.
Sí.
Settle.
Que yo no lo he utilizado muchísimo, la verdad.
Pero lo poco que sé es que...
Vamos a copiarnos lo mismo de arriba.
Pero en lugar de utilizar el Promise All, vamos a utilizar el Promise All Settle.
¿Vale?
El Promise All Settle lo que tiene es que siempre se resuelve y te devuelve un Array donde vas a ser capaz.
De saber si una de las promesas ha fallado o no.
Lo cual ya es una diferencia bastante grande respecto al Promise All.
Porque el Promise All, en cuanto te peta una de las promesas del Array, ya la has liado.
Ya no puedes hacer un punto den y solo puedes hacer un Catch para hacer un Catch del error.
Lo cual es una fastidiada.
Imagínate que esto que ha fallado aquí fuese opcional.
Pues liada.
En cambio, el Promise All Settle lo que hace se resuelve siempre.
Pero en Values lo que vamos a tener...
Voy a comentar esto para que me salga más arriba la consola.
¿Vale?
Que si no, aparecerá mi cara encima.
Venga.
Con el Promise All Settle podemos hacer un Den.
Y aquí vamos a tener un Array.
Dentro de Values, ¿ves?
Tenemos un Array donde nos va a decir cada una de las promesas si ha ido bien y su valor.
Por ejemplo, la primera promesa que la habíamos resuelto con un 13.
¿Vale?
Promise All Settle lo tenemos aquí.
El Status Fulfill, o sea, ha ido bien, y el valor 13.
La segunda promesa que habíamos hecho, un Reject.
Esto tiene un error.
Esto es un error.
Entonces aquí tendríamos la segunda posición, el Status Rejected, y el Reason, pues el error que hemos devuelto antes.
Y en la tercera promesa que hemos hecho que se dispare después de 100 milisegundos,
lo que está haciendo aquí es que al final ha sido Fulfill porque ha esperado que fuese bien.
O sea, ha esperado esos 100 milisegundos y ya tiene aquí el valor.
O sea, se ha resuelto correctamente.
Así que ahora aquí en Values ya podríamos, por ejemplo, podríamos recuperarlos.
Podríamos hacer un montón de cosas.
Pero podríamos tener el...
A ver, ¿cómo era?
Un momento.
Era Value, ¿no?
Podríamos tener en el primero...
En el primero podríamos extraer el Value y llamarle First Promise Value.
En el segundo tenemos el Value, le ponemos Second Promise Value.
Que ya te digo que este no tiene valor porque como ha fallado, pues...
Y en el tercero el Value sería Third Promise Value.
Y esto lo podríamos poner aquí.
A ver cada una que tiene.
Y ya ves que es totalmente diferente porque tenemos un control más granular en cada una de las promesas.
Uy, ¿qué he hecho aquí?
¿Qué he hecho aquí?
Esto viene de Values.
Ya está.
¿Vale?
¿Veis?
De la primera promesa hemos conseguido el 13.
De la segunda promesa es Undefined porque ha sido Rejected.
De la tercera promesa tenemos un 26.
De esta forma el All Settle te da este control que con el Promisol no tienes.
Que es mucho más del Promisol es...
Es o todo o nada.
Si peta, lo curón.
Y se acabó.
Así que de esta forma, pues...
Promisol 7 nos debería ayudar a hacer este tipo de control mejor y saber cuál en concreto ha petado.
En el Promisol que hemos visto, no es el orden en el que se resuelvan las promesas.
¿Vale?
En el Promisol es el orden que tienen en el Array.
Si en el Array tienen un orden en concreto, es el orden en el que luego te los tendrás.
Igual en el Promisol 7.
O sea, el orden que tú tienes.
O sea, para que esto quede clarísimo.
¿Ves que hemos puesto aquí que esto tarda 100?
Si yo esto lo muevo en el primero, ¿vale?
Esto significa que en el Array el primer elemento es este.
Por lo tanto, aquí el First Promise Value, este siempre va a ser 26.
¿Veis? Esto tarde 100 milisegundos o tarde 5 horas o lo que sea, ¿vale?
O sea, que es importante que esto lo tengáis súper en cuenta.
Bueno, no sé por qué sale el Pending.
Ah, porque tarda 5 segundos, ¿ves?
Ahora va a tardar 5 segundos y eventualmente saldrá, ¿ves? Aquí.
O sea, que lo que da aquí el orden, este orden en realidad, viene por el orden que tiene en este Array.
No por otra cosa.
No es el orden en el que se van resolviendo, sino eso sería una locura.
Sería una locura.
Eso sería súper difícil.
No sé si esto es lo que quería saber, pero espero que sí.