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:
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:
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.
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ă
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.
Afișează indiciu
pentru ... din și apăsați(așteptați t())
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
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.
Afișează indiciu
Promise.all(tasks.map((t) => t()))
Soluție disponibilă după 3 încercări