Lecciones del módulo (4/4)
Desafío: programación con Promesas
"Scheduling" significa decidir cómo ejecutar una lista de tareas asíncronas: todas juntas,
una a la vez, o en pequeños grupos. Combineremo Promise.all, for await y closures.
En paralelo: todo junto
Cuando las tareas son independientes y rápidas, lánzalas todas y espéralas con Promise.all:
async function inParallelo(tasks) {
return Promise.all(tasks.map((t) => t()));
}
const risultati = await inParallelo([
() => Promise.resolve(1),
() => Promise.resolve(2),
() => Promise.resolve(3),
]);
// [1, 2, 3]Tiempo total ≈ tiempo de la tarea más lenta.
En serie: una a la vez
Cuando cada tarea depende de la anterior, o quieres aplicar un límite de tasa (rate-limit):
async function inSerie(tasks) {
const risultati = [];
for (const t of tasks) {
risultati.push(await t());
}
return risultati;
}Tiempo total ≈ suma de los tiempos.
Con límite de concurrencia
A veces no quieres mil peticiones concurrentes, pero tampoco quieres esperarlas en serie: quieres un máximo de N en vuelo.
async function conLimite(tasks, n) {
const risultati = new Array(tasks.length);
let i = 0;
async function worker() {
while (i < tasks.length) {
const mio = i++;
risultati[mio] = await tasks[mio]();
}
}
await Promise.all(Array.from({ length: n }, worker));
return risultati;
}Idea: lanzas n "workers" que van obteniendo el siguiente índice hasta que no queda nada.
Pruébalo tú
Define `inSeries(tasks)` async: dado un array de funciones que devuelven Promises, ejecútalas una a la vez (await) y devuelve el array de resultados en el orden de ejecución.
Mostrar pista
for ... of e push(await t())
Solución disponible después de 3 intentos
Ejercicio de repaso
Define `inParallel(tasks)` async: dado un array de funciones que devuelven Promises, lánzalas todas en paralelo y devuelve un array con los resultados en el mismo orden de la entrada. Usa Promise.all.
Mostrar pista
Promise.all(tasks.map((t) => t()))
Solución disponible después de 3 intentos