Saltar al contenido principal
eLearner.app
Módulo 8 · Lección 4 de 432/32 en el curso~15 min
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:

JS
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):

JS
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.

JS
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ú

Ejercicio#js.m8.l4.e1
Intentos: 0Cargando...

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.

Cargando editor...
Mostrar pista

for ... of e push(await t())

Solución disponible después de 3 intentos

Ejercicio de repaso

Ejercicio#js.m8.l4.e2
Intentos: 0Cargando...

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.

Cargando editor...
Mostrar pista

Promise.all(tasks.map((t) => t()))

Solución disponible después de 3 intentos