|
| 1 | +<div align="center"> |
| 2 | + <h1> 30 Días de JavaScript: Promesas</h1> |
| 3 | + <a class="header-badge" target="_blank" href="https://www.linkedin.com/in/asabeneh/"> |
| 4 | + <img src="https://img.shields.io/badge/style--5eba00.svg?label=LinkedIn&logo=linkedin&style=social"> |
| 5 | + </a> |
| 6 | + <a class="header-badge" target="_blank" href="https://twitter.com/Asabeneh"> |
| 7 | + <img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/asabeneh?style=social"> |
| 8 | + </a> |
| 9 | + |
| 10 | +<sub>Autor: |
| 11 | +<a href="https://www.linkedin.com/in/asabeneh/" target="_blank">Asabeneh Yetayeh</a><br> |
| 12 | +<small> Enero, 2020</small> |
| 13 | +</sub> |
| 14 | + |
| 15 | +</div> |
| 16 | + |
| 17 | +[<< Día 17](../dia_17_Web_storages/dia_17_web_storages.md) | [Día 19>>](../dia_19_Closures/dia_19_closures.md) |
| 18 | + |
| 19 | + |
| 20 | + |
| 21 | +- [Día 18](#día-18) |
| 22 | + - [Promesas](#promesas) |
| 23 | + - [Callbacks](#callbacks) |
| 24 | + - [Constructor de promesas](#constructor-de-promesas) |
| 25 | + - [Fetch API](#fetch-api) |
| 26 | + - [Async y Await](#async-y-await) |
| 27 | + - [Ejercicios](#ejercicios) |
| 28 | + - [Ejercicios: Nivel 1](#ejercicios-nivel-1) |
| 29 | + - [Ejercicios: Nivel 2](#ejercicios-nivel-2) |
| 30 | + - [Ejercicios: Nivel 3](#ejercicios-nivel-3) |
| 31 | + |
| 32 | +# Día 18 |
| 33 | + |
| 34 | +## Promesas |
| 35 | + |
| 36 | +Los seres humanos damos o recibimos una promesa para realizar alguna actividad en algún momento. Si cumplimos la promesa, hacemos felices a los demás, pero si no la cumplimos, puede provocar descontento. La promesa en JavaScript tiene algo en común con los ejemplos anteriores. |
| 37 | + |
| 38 | +Una promesa es una forma de manejar operaciones asíncronas en JavaScript. Permite a los manejadores con un valor eventual de éxito o razón de fracaso de una acción asíncrona. Esto permite que los métodos asíncronos devuelvan valores como los métodos síncronos: en lugar de devolver inmediatamente el valor final, el método asíncrono devuelve una promesa de proporcionar el valor en algún momento en el futuro. |
| 39 | + |
| 40 | +Una promesa está en uno de estos estados: |
| 41 | + |
| 42 | +- pendiente: estado inicial, ni cumplido ni rechazado. |
| 43 | +- cumplido: significa que la operación se ha completado con éxito. |
| 44 | +- rechazado: significa que la operación ha fallado. |
| 45 | + |
| 46 | +Una promesa pendiente puede ser cumplida con un valor, o rechazada con una razón (error). Cuando ocurre cualquiera de estas opciones, se llaman los manejadores asociados puestos en cola por el método _then_ de una promesa. (Si la promesa ya se ha cumplido o ha sido rechazada cuando se adjunta un manejador correspondiente, se llamará al manejador, por lo que no hay una condición de competencia entre una operación asíncrona que se completa y sus manejadores que se adjuntan). |
| 47 | + |
| 48 | +Como los métodos _Promise.prototype.then()_ y _Promise.prototype.catch()_ devuelven promesas, pueden encadenarse. |
| 49 | + |
| 50 | +## Callbacks |
| 51 | + |
| 52 | +Para entender muy bien la promesa, entendamos primero la devolución de llamada. Veamos los siguientes callbacks. A partir de los siguientes bloques de código se notará, la diferencia entre callback y promesas. |
| 53 | + |
| 54 | +- call back |
| 55 | + Veamos una función callback que puede tomar dos parámetros. El primer parámetro es err y el segundo es result. Si el parámetro err es falso, no habrá error, de lo contrario retornará un error. |
| 56 | + |
| 57 | +En este caso el err tiene un valor y devolverá el bloque err. |
| 58 | + |
| 59 | +```js |
| 60 | +//Callback |
| 61 | +const doSomething = (callback) => { |
| 62 | + setTimeout(() => { |
| 63 | + const skills = ["HTML", "CSS", "JS"]; |
| 64 | + callback("It did not go well", skills); |
| 65 | + }, 2000); |
| 66 | +}; |
| 67 | + |
| 68 | +const callback = (err, result) => { |
| 69 | + if (err) { |
| 70 | + return console.log(err); |
| 71 | + } |
| 72 | + return console.log(result); |
| 73 | +}; |
| 74 | + |
| 75 | +doSomething(callback); |
| 76 | +``` |
| 77 | + |
| 78 | +```sh |
| 79 | +// después de 2 segundos se imprimirá |
| 80 | +It did not go well |
| 81 | +``` |
| 82 | + |
| 83 | +En este caso el err es falso y devolverá el bloque else que es el resultado. |
| 84 | + |
| 85 | +```js |
| 86 | +const doSomething = (callback) => { |
| 87 | + setTimeout(() => { |
| 88 | + const skills = ["HTML", "CSS", "JS"]; |
| 89 | + callback(false, skills); |
| 90 | + }, 2000); |
| 91 | +}; |
| 92 | + |
| 93 | +doSomething((err, result) => { |
| 94 | + if (err) { |
| 95 | + return console.log(err); |
| 96 | + } |
| 97 | + return console.log(result); |
| 98 | +}); |
| 99 | +``` |
| 100 | + |
| 101 | +```sh |
| 102 | +// después de 2 segundos imprimirá las habilidades |
| 103 | +["HTML", "CSS", "JS"] |
| 104 | +``` |
| 105 | + |
| 106 | +### Constructor de promesas |
| 107 | + |
| 108 | +Podemos crear una promesa utilizando el constructor Promise. Podemos crear una nueva promesa utilizando la palabra clave `new` seguida de la palabra `Promise` y seguida de un paréntesis. Dentro del paréntesis, toma una función `callback`. La función de callback de la promesa tiene dos parámetros que son las funciones _`resolve`_ y _`reject`_. |
| 109 | + |
| 110 | +```js |
| 111 | +// sintaxis |
| 112 | +const promise = new Promise((resolve, reject) => { |
| 113 | + resolve("success"); |
| 114 | + reject("failure"); |
| 115 | +}); |
| 116 | +``` |
| 117 | + |
| 118 | +```js |
| 119 | +// Promesas |
| 120 | +const doPromise = new Promise((resolve, reject) => { |
| 121 | + setTimeout(() => { |
| 122 | + const skills = ["HTML", "CSS", "JS"]; |
| 123 | + if (skills.length > 0) { |
| 124 | + resolve(skills); |
| 125 | + } else { |
| 126 | + reject("Something wrong has happened"); |
| 127 | + } |
| 128 | + }, 2000); |
| 129 | +}); |
| 130 | + |
| 131 | +doPromise |
| 132 | + .then((result) => { |
| 133 | + console.log(result); |
| 134 | + }) |
| 135 | + .catch((error) => console.log(error)); |
| 136 | +``` |
| 137 | + |
| 138 | +```sh |
| 139 | +["HTML", "CSS", "JS"] |
| 140 | +``` |
| 141 | + |
| 142 | +La promesa anterior se ha resuelto con resolución. |
| 143 | +Veamos otro ejemplo cuando la promesa se resuelve con el rechazo (reject). |
| 144 | + |
| 145 | +```js |
| 146 | +// Promesa |
| 147 | +const doPromise = new Promise((resolve, reject) => { |
| 148 | + setTimeout(() => { |
| 149 | + const skills = ["HTML", "CSS", "JS"]; |
| 150 | + if (skills.includes("Node")) { |
| 151 | + resolve("fullstack developer"); |
| 152 | + } else { |
| 153 | + reject("Something wrong has happened"); |
| 154 | + } |
| 155 | + }, 2000); |
| 156 | +}); |
| 157 | + |
| 158 | +doPromise |
| 159 | + .then((result) => { |
| 160 | + console.log(result); |
| 161 | + }) |
| 162 | + .catch((error) => console.error(error)); |
| 163 | +``` |
| 164 | + |
| 165 | +```sh |
| 166 | +Something wrong has happened |
| 167 | +``` |
| 168 | + |
| 169 | +## Fetch API |
| 170 | + |
| 171 | +La API Fetch proporciona una interfaz para obtener recursos (incluso a través de la red). A cualquiera que haya utilizado XMLHttpRequest le resultará familiar, pero la nueva API ofrece un conjunto de funciones más potente y flexible. En este reto utilizaremos fetch para solicitar url y APIS. Además de esto, veamos una demostración del caso de uso de las promesas en el acceso a los recursos de la red utilizando la API fetch. |
| 172 | + |
| 173 | +```js |
| 174 | +const url = "https://restcountries.com/v2/all"; // api de países |
| 175 | +fetch(url) |
| 176 | + .then((response) => response.json()) // acceder a los datos de la API como JSON |
| 177 | + .then((data) => { |
| 178 | + // obtener los datos |
| 179 | + console.log(data); |
| 180 | + }) |
| 181 | + .catch((error) => console.error(error)); // manejo de errores si ocurre algo incorrecto |
| 182 | +``` |
| 183 | + |
| 184 | +## Async y Await |
| 185 | + |
| 186 | +Async y await es una forma elegante de manejar las promesas. Es fácil de entender y limpio de escribir. |
| 187 | + |
| 188 | +```js |
| 189 | +const square = async function (n) { |
| 190 | + return n * n; |
| 191 | +}; |
| 192 | + |
| 193 | +square(2); |
| 194 | +``` |
| 195 | + |
| 196 | +```sh |
| 197 | +Promesa {<resolved>: 4} |
| 198 | +``` |
| 199 | + |
| 200 | +La palabra _async_ delante de una función significa que esa función devolverá una promesa. La función cuadrada anterior en lugar de un valor devuelve una promesa. |
| 201 | + |
| 202 | +¿Cómo accedemos al valor de la promesa? Para acceder al valor de la promesa, utilizaremos la palabra clave _await_. |
| 203 | + |
| 204 | +```js |
| 205 | +const square = async function (n) { |
| 206 | + return n * n; |
| 207 | +}; |
| 208 | +const value = await square(2); |
| 209 | +console.log(value); |
| 210 | +``` |
| 211 | + |
| 212 | +```sh |
| 213 | +4 |
| 214 | +``` |
| 215 | + |
| 216 | +Ahora, como puedes ver en el ejemplo anterior escribiendo async delante de una función creamos una promesa y para obtener el valor de una promesa utilizamos await. Async y await van juntos, uno no puede existir sin el otro. |
| 217 | + |
| 218 | +Vamos a obtener los datos de la API utilizando tanto el método promise como el método async y await. |
| 219 | + |
| 220 | +- promesa |
| 221 | + |
| 222 | +```js |
| 223 | +const url = "https://restcountries.com/v2/all"; |
| 224 | +fetch(url) |
| 225 | + .then((response) => response.json()) |
| 226 | + .then((data) => { |
| 227 | + console.log(data); |
| 228 | + }) |
| 229 | + .catch((error) => console.error(error)); |
| 230 | +``` |
| 231 | + |
| 232 | +- async y await |
| 233 | + |
| 234 | +```js |
| 235 | +const fetchData = async () => { |
| 236 | + try { |
| 237 | + const response = await fetch(url); |
| 238 | + const countries = await response.json(); |
| 239 | + console.log(countries); |
| 240 | + } catch (err) { |
| 241 | + console.error(err); |
| 242 | + } |
| 243 | +}; |
| 244 | +console.log("===== async and await"); |
| 245 | +fetchData(); |
| 246 | +``` |
| 247 | + |
| 248 | +🌕 Eres consistente y has cumplido tu promesa, has llegado al día 18. Mantén tu promesa y resuelve el desafío con determinación. Has dado 18 pasos adelante en tu camino hacia la grandeza. Ahora haz algunos ejercicios para tu cerebro y tus músculos. |
| 249 | + |
| 250 | +## Ejercicios |
| 251 | + |
| 252 | +```js |
| 253 | +const countriesAPI = "https://restcountries.com/v2/all"; |
| 254 | +const catsAPI = "https://api.thecatapi.com/v1/breeds"; |
| 255 | +``` |
| 256 | + |
| 257 | +### Ejercicios: Nivel 1 |
| 258 | + |
| 259 | +1. Lee la API de los países utilizando fetch e imprime el nombre del país, la capital, los idiomas, la población y la superficie. |
| 260 | + |
| 261 | +### Ejercicios: Nivel 2 |
| 262 | + |
| 263 | +1. Imprime todos los nombres de los gatos en la variable catNames. |
| 264 | + |
| 265 | +### Ejercicios: Nivel 3 |
| 266 | + |
| 267 | +1. Lee el api de los gatos y encuentra el peso medio del gato en unidad métrica. |
| 268 | +2. Lee la api de países y descubre los 10 países más grandes |
| 269 | +3. Lea la api de los países y cuente el número total de lenguas del mundo utilizadas como oficiales. |
| 270 | + |
| 271 | +🎉 ¡FELICITACIONES! 🎉 |
| 272 | + |
| 273 | +[<< Día 17](../dia_17_Web_storages/dia_17_web_storages.md) | [Día 19>>](../dia_19_Closures/dia_19_closures.md) |
0 commit comments