Contenido del curso
Configuracion
¿Qué se implementó en ES6?
- 4

let, const y arrow functions en ES6
15:29 min - 5

Template literals en JavaScript ES6
08:11 min - 6

Parámetros por defecto en funciones ES6
05:46 min - 7

Desestructuración de arrays y objetos en JavaScript
05:33 min - 8

Spread y rest parameters en JavaScript
07:30 min - 9

Playground: Combina objetos JSON con el Spread Operator
- 10

Object literals abreviados en ES6
05:42 min - 11

Promesas en JavaScript con resolve y reject
08:09 min - 12

Clases en JavaScript con getters y setters
18:54 min - 13

Módulos en JavaScript con import y export
09:48 min - 14

Playground: Obtén una lista de películas
- 15

Generators en JavaScript: control del estado
07:19 min - 16

Playground: Generador de identificadores para michis
- 17

Método add() y encadenamiento en Sets JS
04:36 min
¿Qué se implementó en ES7?
¿Qué se implementó en ES8?
¿Qué se implementó en ES9?
¿Qué se implementó en ES10?
¿Qué se implementó en ES11?
¿Qué se implementó en ES12?
¿Qué se implementó en ES13?
Recapitulación
finally y for await en ES9
Resumen
Las promesas en JavaScript ganaron un nuevo aliado con ECMAScript 9: el método finally, que se ejecuta cuando la promesa termina, sin importar si fue resuelta o rechazada. Junto con las iteraciones asíncronas (for await...of) y los generadores con async/await, esta versión amplía el control sobre flujos asincrónicos en aplicaciones modernas.
¿Qué hace finally en una promesa de JavaScript?
El bloque finally se ejecuta siempre al cerrar el ciclo de una promesa, después de then o catch. Sirve para liberar recursos, ocultar loaders o mostrar mensajes de cierre sin duplicar lógica.
Imagina que llamas a una API y quieres apagar un spinner sin importar el resultado. Antes de ECMAScript 9 tenías que repetir esa instrucción en then y en catch. Con finally la escribes una sola vez.
¿Cuándo se ejecuta finally? Después de que la promesa se resuelve o se rechaza. No importa si entraste a
thenocatch: el bloque siempre corre al final [02:00].
¿Cómo se escribe finally con resolve y reject?
La sintaxis se encadena como cualquier otro método de promesa. Tomas el ejemplo de promesa que ya conoces de ECMAScript 6 y agregas el bloque al final con una arrow function.
js miPromesa .then(response => console.log(response)) .catch(error => console.log(error)) .finally(() => console.log('Por fin terminó'));
Al ejecutar, si la promesa cae en resolve, verás el mensaje del then y luego Por fin terminó. Si entra en reject, pasa por catch y también imprime el finally. Ese cierre es lo interesante: siempre se cumple.
¿Cómo funcionan las iteraciones asíncronas con generators?
ECMAScript 9 sumó el manejo de asynchronous iteration, que combina los generators de ECMAScript 6 con el async/await que llegó en ECMAScript 8. La idea: pausar la entrega de valores hasta que cada promesa interna se resuelva.
Un generator se declara con function* y usa yield para entregar valores por demanda. Cuando lo marcas como async, puedes hacer yield await sobre una promesa.
js async function* anotherGenerator() { yield await Promise.resolve(1); yield await Promise.resolve(2); yield await Promise.resolve(3); }
const another = anotherGenerator(); another.next().then(response => console.log(response.value)); another.next().then(response => console.log(response.value)); another.next().then(response => console.log(response.value));
Al correrlo verás Hello, 1, 2, 3 (si imprimes un saludo antes). El método next() devuelve una promesa con value y done, por eso necesitas then para acceder al valor [05:30].
¿Qué pasa si quitas async del generator? El
thendeja de estar disponible porquenext()ya no retorna una promesa. La sintaxis se rompe y el flujo asincrónico desaparece.
¿Cómo recorrer un array con for await of?
La otra forma de iterar de manera asíncrona es con for await...of, que recorre estructuras iterables esperando cada valor antes de continuar.
js async function arrayOfNames(array) { for await (let value of array) { console.log(value); } }
const names = arrayOfNames(['Óscar', 'David', 'Ana']); console.log('after');
Al ejecutarlo verás primero after y luego los nombres. Eso confirma algo clave: el ciclo no bloquea el hilo principal. El programa sigue corriendo mientras el for await procesa los elementos uno a uno.
¿Por qué importan estas características en aplicaciones reales?
Cuando consumes APIs, manejas streams o lees archivos por chunks, necesitas controlar el cierre y la espera de cada operación. finally te ahorra repetición de código, mientras que las iteraciones asíncronas te permiten procesar colecciones donde cada elemento depende de una promesa.
Algunos casos donde lo vas a usar:
- Cerrar conexiones a bases de datos cuando termina una consulta.
- Ocultar indicadores de carga sin importar si la petición falló.
- Procesar listas de URLs y esperar la respuesta de cada una antes de seguir.
Prueba quitar el async, cambia los valores del array, mete un reject para forzar el catch y observa cómo finally se mantiene firme. Cuéntame en los comentarios qué resultado obtuviste cuando rompiste la sintaxis a propósito.