Ana içeriğe geç
Modül 8 · Ders 4 ders 4Kurstaki 32/32~15 min
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:

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]

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:

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

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

Fikir: Geriye hiçbir şey kalmayana kadar bir sonraki dizini alan n "işçileri" başlatırsınız.

Deneyin

Egzersiz#js.m8.l4.e1
Denemeler: 0Yükleniyor…

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

Düzenleyici yükleniyor…
İpucu göster

for ... of ve Push(beklemede t())

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#js.m8.l4.e2
Denemeler: 0Yükleniyor…

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

Düzenleyici yükleniyor…
İpucu göster

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

3 denemeden sonra çözüm mevcut