Lompati ke konten utama
Modul 8 · Pelajaran 4 dari 432/32 dalam kursus~15 min
Pelajaran modul (4/4)

Tantangan: penjadwalan dengan Promises

"Penjadwalan" berarti memutuskan cara menjalankan daftar tugas asinkron: semuanya secara bersamaan, satu per satu, atau dalam kelompok kecil. Kami akan menggabungkan Promise.all, for await, dan penutupan.

Secara paralel: semuanya bersama-sama

Saat tugas mandiri dan cepat, luncurkan semuanya dan tunggu dengan 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]

Total waktu ≈ waktu tugas paling lambat.

Secara seri: satu per satu

Ketika setiap tugas bergantung pada tugas sebelumnya, atau Anda ingin membatasi nilai:

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

Total waktu ≈ jumlah waktu.

Dengan batas konkurensi

Terkadang Anda tidak menginginkan ribuan permintaan secara bersamaan, tetapi Anda tidak ingin menunggu permintaan tersebut masuk seri: Anda menginginkan maksimum N dalam penerbangan.

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

Idenya: Anda meluncurkan n "pekerja" yang mengambil indeks berikutnya hingga tidak ada yang tersisa.

Cobalah

Latihan#js.m8.l4.e1
Upaya: 0Memuat…

Definisikan `inSeries(tasks)` async: jika ada array fungsi yang mengembalikan Promises, jalankan fungsi tersebut satu per satu (tunggu) dan kembalikan array hasil dalam urutan eksekusi.

Memuat editor…
Tunjukkan petunjuk

untuk ... dari dan dorong (tunggu t())

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#js.m8.l4.e2
Upaya: 0Memuat…

Definisikan async `inParallel(tasks)`: dengan serangkaian fungsi yang mengembalikan Janji, luncurkan semuanya secara paralel dan kembalikan serangkaian hasil dalam urutan yang sama dengan input. Gunakan Promise.all.

Memuat editor…
Tunjukkan petunjuk

Janji.semua(tugas.peta((t) => t()))

Solusi tersedia setelah 3 upaya