Salt la conținutul principal
Modulul 8 · Lecția 4 din 432/32 în curs~15 min
Lecții din modul (4/4)

Provocare: programarea cu Promises

„Programare” înseamnă să decideți cum să rulați o listă de sarcini asincrone: toate împreună, una câte una, sau în grupuri mici. Vom combina Promise.all, for await și închiderile.

În paralel: toate împreună

Când sarcinile sunt independente și rapide, lansați-le pe toate și așteptați cu 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]

Timp total ≈ timpul sarcinii cea mai lentă.

În serie: unul câte unul

Când fiecare sarcină depinde de cea anterioară sau când doriți să limitați rata:

JS
async function inSerie(tasks) {
  const risultati = [];
  for (const t of tasks) {
    risultati.push(await t());
  }
  return risultati;
}

Timpul total ≈ suma timpilor.

Cu o limită de concurență

Uneori nu vrei o mie de cereri concurente, dar nu vrei să le aștepți fie seria: vrei un maximum de N în zbor.

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;
}

Ideea: lansați n „lucrători” care iau următorul index până nu mai rămâne nimic.

Încearcă

Exercițiu#js.m8.l4.e1
Încercări: 0Se încarcă…

Definiți `inSeries(tasks)` asincron: având în vedere o serie de funcții care returnează Promise, rulați-le una câte una (așteptați) și returnați matricea de rezultate în ordinea execuției.

Se încarcă editorul...
Afișează indiciu

pentru ... din și apăsați(așteptați t())

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#js.m8.l4.e2
Încercări: 0Se încarcă…

Definiți `inParallel(tasks)` asincron: având în vedere o serie de funcții care returnează Promises, lansați-le pe toate în paralel și returnați o serie de rezultate în aceeași ordine ca și intrarea. Folosiți Promise.all.

Se încarcă editorul...
Afișează indiciu

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

Soluție disponibilă după 3 încercări