Skip to content

Commit 43b6978

Browse files
committed
Clase 4 Intermedio | 19/02/2025
Programación asíncrona
1 parent ed349d9 commit 43b6978

File tree

3 files changed

+211
-2
lines changed

3 files changed

+211
-2
lines changed

Intermediate/07-async.js

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
/*
2+
Clase 4 - Programación asíncrona (19/02/2025)
3+
Vídeo: https://www.twitch.tv/videos/2385650388?t=00h22m48s
4+
*/
5+
6+
// Programación asíncrona
7+
8+
// Código síncrono
9+
10+
console.log("Inicio")
11+
12+
for (let i = 0; i < 100000000; i++) { }
13+
14+
console.log("Fin")
15+
16+
// Event Loop (Bucle de eventos)
17+
18+
// Componentes del Event Loop:
19+
// 1. Call Stack (Pila de ejecución)
20+
// 2. Web APIs (APIs del navegador) o Node.js:
21+
// 3. Task Queue (setTimeout()) y Microtask Queue (Promesas)
22+
23+
// Flujo del Event Loop:
24+
// 1. Call Stack
25+
// 2. Operaciones asíncronas -> Web APIs o Node.js
26+
// 3. Operación termina -> La coloca en Task Queue o Microtask Queue
27+
// 4. Si Call Stack vacío -> Mueve tareas del Microtask Queue o Task Queue al Call Stack
28+
// 5. El proceso se repite
29+
30+
// Código asíncrono
31+
32+
// - Callbacks
33+
34+
console.log("Inicio")
35+
36+
setTimeout(() => {
37+
console.log("Esto se ejecuta después de 2 segundos")
38+
}, 2000)
39+
40+
console.log("Fin")
41+
42+
// - Problema: Callback Hell
43+
44+
function step1(callback) {
45+
setTimeout(() => {
46+
console.log("Paso 1 completado")
47+
callback()
48+
}, 1000)
49+
}
50+
51+
function step2(callback) {
52+
setTimeout(() => {
53+
console.log("Paso 2 completado")
54+
callback()
55+
}, 1000)
56+
}
57+
58+
function step3(callback) {
59+
setTimeout(() => {
60+
console.log("Paso 3 completado")
61+
callback()
62+
}, 1000)
63+
}
64+
65+
step1(() => {
66+
step2(() => {
67+
step3(() => {
68+
console.log("Todos los pasos completados")
69+
})
70+
})
71+
})
72+
73+
// - Promesas
74+
75+
const promise = new Promise((resolve, reject) => {
76+
// IMPORTANTE: Inicialmente escribí setInterval, pero lo correcto es setTimeout
77+
// setInterval se ejecutaría indefinidamente cada 4s, y el proceso nunca finalizaría
78+
setTimeout(() => {
79+
const ok = false
80+
if (ok) {
81+
resolve("Operación exitosa")
82+
} else {
83+
reject("Se ha producido un error")
84+
}
85+
}, 4000)
86+
})
87+
88+
promise
89+
.then(result => {
90+
console.log(result)
91+
})
92+
.catch(error => {
93+
console.log(error)
94+
})
95+
96+
// - Encadenamiento de promesas
97+
98+
function step1Promise() {
99+
return new Promise(resolve => {
100+
setTimeout(() => {
101+
console.log("Paso 1 con promesa completado")
102+
resolve()
103+
}, 1000)
104+
})
105+
}
106+
107+
function step2Promise() {
108+
return new Promise(resolve => {
109+
setTimeout(() => {
110+
console.log("Paso 2 con promesa completado")
111+
resolve()
112+
}, 1000)
113+
})
114+
}
115+
116+
function step3Promise() {
117+
return new Promise(resolve => {
118+
setTimeout(() => {
119+
console.log("Paso 3 con promesa completado")
120+
resolve()
121+
}, 1000)
122+
})
123+
}
124+
125+
step1Promise()
126+
.then(step2Promise)
127+
.then(step3Promise)
128+
.then(() => {
129+
console.log("Todos los pasos con promesa completados")
130+
})
131+
132+
// - Async/Await
133+
134+
function wait(ms) {
135+
return new Promise(resolve => setTimeout(resolve, ms))
136+
}
137+
138+
async function process() {
139+
140+
console.log("Inicio del proceso")
141+
142+
await wait(5000)
143+
console.log("Proceso después de 5 segundos")
144+
145+
await wait(1000)
146+
console.log("Proceso después de 1 segundo")
147+
148+
await wait(2000)
149+
console.log("Proceso después de 2 segundos")
150+
151+
console.log("Fin del proceso")
152+
}
153+
154+
process()

Intermediate/08-async-exercises.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
Clase 4 - Programación asíncrona (19/02/2025)
3+
Vídeo: https://www.twitch.tv/videos/2385650388?t=00h22m48s
4+
*/
5+
6+
// 1. Crea una función para saludar que reciba un nombre y un callback.
7+
// El callback debe ejecutarse después de 2 segundos y mostrar en consola "Hola, [nombre]".
8+
9+
// 2. Crea tres funciones task1(callback), task2(callback) y task3(callback).
10+
// Cada función debe tardar 1 segundo en ejecutarse y luego llamar al callback.
11+
12+
// 3. Crea una función para verificar un número que retorne una Promesa.
13+
// Si el número es par, la promesa se resuelve con el mensaje "Número par".
14+
// Si el número es impar, la promesa se rechaza con el mensaje "Número impar".
15+
16+
// 4. Crea tres funciones que devuelvan promesas:
17+
// firstTask(): tarda 1s y muestra "Primera tarea completada".
18+
// secondTask(): tarda 2s y muestra "Segunda tarea completada".
19+
// thirdTask(): tarda 1.5s y muestra "Tercera tarea completada".
20+
21+
// 5. Transforma el ejercicio anterior de Promesas en una función async/await llamada executeTasks().
22+
23+
// 6. Crea una función getUser(id) que devuelva una promesa y simule una llamada a una API (que se demore 2s).
24+
// Si el id es menor a 5, la promesa se resuelve con { id, nombre: "Usuario " + id }.
25+
// Si el id es 5 o mayor, la promesa se rechaza con el mensaje "Usuario no encontrado".
26+
// Usa async/await para llamar a getUser(id) y maneja los errores con try/catch.
27+
28+
// 7. Intenta predecir el resultado de este código antes de ejecutarlo en la consola:
29+
// console.log("Inicio")
30+
// setTimeout(() => console.log("setTimeout ejecutado"), 0)
31+
// Promise.resolve().then(() => console.log("Promesa resuelta"))
32+
// console.log("Fin")
33+
34+
// 8. Crea tres funciones que devuelvan promesas con tiempos de espera distintos.
35+
// A continuación, usa Promise.all() para ejecutarlas todas al mismo tiempo y mostrar "Todas las promesas resueltas" cuando terminen.
36+
37+
// 9. Crea una función waitSeconds(segundos) que use setTimeout dentro de una Promesa para esperar la cantidad de segundos indicada.
38+
// A continuación, usa async/await para que se espere 3 segundos antes de mostrar "Tiempo finalizado" en consola.
39+
40+
// 10. Crea una simulación de un cajero automático usando asincronía.
41+
// - La función checkBalance() tarda 1s y devuelve un saldo de 500$.
42+
// - La función withdrawMoney(amount) tarda 2s y retira dinero si hay suficiente saldo, o devuelve un error si no hay fondos.
43+
// - Usa async/await para hacer que el usuario intente retirar 300$ y luego 300$ más.
44+
//
45+
// Posible salida esperada:
46+
// Saldo disponible: 500$
47+
// Retirando 300$...
48+
// Operación exitosa, saldo restante: 200$
49+
// Retirando 300$...
50+
// Error: Fondos insuficientes

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515

1616
### Curso de fundamentos intermedio (continuación del desde cero). Nueva clase cada semana.
1717

18-
#### 🔴 PRÓXIMA CLASE EN DIRECTO: Miércoles 19 de febrero a las 20:00h (España) en [Twitch](https://twitch.tv/mouredev) y [YouTube](https://youtube.com/@mouredev)
19-
#### 🗓️ CONSULTA EL HORARIO POR PAÍS Y CREA UN RECORDATORIO desde [Discord](https://discord.gg/umXned72?event=1339346133624946889)
18+
#### 🔴 PRÓXIMA CLASE EN DIRECTO: Miércoles 26 de febrero a las 20:00h (España) en [Twitch](https://twitch.tv/mouredev) y [YouTube](https://youtube.com/@mouredev)
19+
#### 🗓️ CONSULTA EL HORARIO POR PAÍS Y CREA UN RECORDATORIO desde [Discord](https://discord.gg/DuE3fHyV?event=1341887890858442772)
2020

2121
* Clase 1 [29/01/2025] - Funciones avanzadas
2222
* [Vídeo](https://www.twitch.tv/videos/2367024319?t=00h08m45s)
@@ -34,6 +34,11 @@
3434
* [Código Clases](./Intermediate/05-advanced-classes.js)
3535
* [Ejericios](./Intermediate/06-advanced-objects-classes-exercises)
3636

37+
* Clase 4 [19/02/2025] - Programación asíncrona
38+
* [Vídeo](https://www.twitch.tv/videos/2385650388?t=00h22m48s)
39+
* [Código](./Intermediate/07-async.js)
40+
* [Ejericios](./Intermediate/08-async-exercises.js)
41+
3742
## Clases en vídeo
3843

3944
### Curso de fundamentos desde cero

0 commit comments

Comments
 (0)