Modül dersleri (4/4)
Zorluk: Promises ile planlama yapmak
"Zamanlama", eşzamansız görevler listesinin nasıl çalıştırılacağına karar vermek anlamına gelir: hepsi bir arada, teker teker,
veya küçük gruplar halinde. Promise.all, for await ve kapanışları birleştireceğiz.
Paralel olarak: hep birlikte
Görevler bağımsız ve hızlı olduğunda, hepsini başlatın ve Promise.all ile bekleyin:
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]Toplam süre ≈ en yavaş görevin süresi.
Seri halinde: teker teker
Her görev bir öncekine bağlı olduğunda veya hız sınırlaması yapmak istediğinizde:
async function inSerie(tasks) {
const risultati = [];
for (const t of tasks) {
risultati.push(await t());
}
return risultati;
}Toplam süre ≈ sürelerin toplamı.
Eşzamanlılık sınırıyla
Bazen eş zamanlı binlerce istek istemezsiniz ama aynı anda onları beklemek de istemezsiniz. serilerden biri: uçuş sırasında maksimum N istiyorsunuz.
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;
}Fikir: Geriye hiçbir şey kalmayana kadar bir sonraki dizini alan n "işçileri" başlatırsınız.
Deneyin
'inSeries(tasks)' async'ini tanımlayın: Promises'ı döndüren bir dizi işlev verildiğinde, bunları birer birer çalıştırın (bekliyor) ve sonuç dizisini yürütme sırasına göre döndürün.
İpucu göster
for ... of ve Push(beklemede t())
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
'inParallel(tasks)' async'i tanımlayın: Promises'ı döndüren bir dizi işlev verildiğinde, hepsini paralel olarak başlatın ve girdiyle aynı sırada bir dizi sonuç döndürün. Promise.all'ı kullanın.
İpucu göster
Promise.all(tasks.map((t) => t()))
3 denemeden sonra çözüm mevcut